我一直在想,是否有一个好的“gitexport”解决方案可以创建一个没有.git存储库目录的树的副本。我知道至少有三种方法:

git克隆,然后删除.git存储库目录。git签出索引暗示了这一功能,但以“只需将所需的树读入索引……”开头,我不完全确定该怎么做。gitexport是一个第三方脚本,本质上是将git克隆到临时位置,然后再将rsync--exclude='.git'复制到最终目标。

这些解决方案中没有一个让我感到满意。最接近svn导出的可能是选项1,因为两者都要求目标目录首先为空。但选项2似乎更好,假设我能够理解将树读入索引意味着什么。


当前回答

这将把一系列提交(C到G)中的文件复制到tar文件中。注意:这只会提交文件。不是整个存储库。此处略有修改

提交历史记录示例

A-->B-->C-->D-->E-->F-->G-->H-->I

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT C~..G | xargs tar -rf myTarFile.tar

git diff树手册页

-r-->递归到子树中

--nocommit-id-->gitdiff树在适用时输出带有commit-id的行。此标志抑制了提交ID输出。

--name only-->仅显示已更改文件的名称。

--diff filter=ACMRT-->仅选择这些文件。请参阅此处以获取文件的完整列表

C..G-->此提交范围内的文件

C~-->包括提交C中的文件。不仅仅是提交C之后的文件。

|xargs tar-rf myTarFile-->输出到tar

其他回答

我的首选实际上是在Makefile(或其他构建系统)中有一个dist目标,它可以导出代码的可分发存档(.tar.bz2、.zip、.jar或其他合适的文件)。如果您碰巧使用GNU自动工具或Perl的MakeMaker系统,我认为这是自动存在的。如果没有,我强烈建议添加它。

ETA(2012-09-06):哇,一票否决。我仍然认为,使用构建工具而不是源代码控制工具来构建发行版更好。我相信使用构建工具构建工件。在我目前的工作中,我们的主要产品是以蚂蚁为目标构建的。我们正处于切换源代码控制系统的过程中,这个蚂蚁目标的出现意味着迁移过程中少了一点麻烦。

我只是想指出,如果你是

导出存储库的子文件夹(这就是我使用SVN导出功能的方式)可以将该文件夹中的所有内容复制到部署目标因为您已经有了整个存储库的副本。

然后,您可以只使用cpfoo[destination]而不是前面提到的gitarchive-master foo|-x-C[destination。

如果你想要一些与子模块一起工作的东西,这可能值得一试。

注:

MASTER_DIR=同时检出子模块的检出DEST_DIR=此导出的结束位置如果你有rsync,我想你可以用更少的球疼做同样的事情。

假设:

您需要从MASTER_DIR的父目录(即MASTER_DIRcd..)运行此命令DEST_DIR假定已创建。如果需要,这很容易修改为包含DEST_DIR的创建

cd MASTER_DIR&&tar-zcvf/DEST_DIR/export.tar.gz--exclude='.git*'.&&cd/DEST_DIR/&&tar xvfz导出.tar.gz&&rm导出.tar.gif

这似乎与SVN相比,Git的问题更小。Git只在存储库根目录中放置.Git文件夹,而SVN在每个子目录中放置.SVN文件夹。因此,“svn-export”避免了递归命令行魔法,而使用Git递归则是不必要的。

相当于

svn export . otherpath

在现有回购协议中

git archive branchname | (cd otherpath; tar x)

相当于

svn export url otherpath

is

git archive --remote=url branchname | (cd otherpath; tar x)