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

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

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


当前回答

简单到克隆,然后删除.git文件夹:

git克隆url_of_your_repo路径到导出&&rm-rf路径到导出/.git

其他回答

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

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

选项1听起来效率不高。如果客户机中没有空间进行克隆,然后删除.git文件夹,该怎么办?

今天我发现自己正在尝试这样做,客户是一个几乎没有空间的树莓派。此外,我还想从存储库中排除一些较重的文件夹。

选项2和此处的其他答案在这种情况下没有帮助。两个git存档(因为需要提交.gitattributes文件,我不想将此排除保存在存储库中)。

这里我分享了我的解决方案,类似于选项3,但不需要gitclone:

tmp=`mktemp`
git ls-tree --name-only -r HEAD > $tmp
rsync -avz --files-from=$tmp --exclude='fonts/*' . raspberry:

将rsync行更改为压缩的等效行也可以作为git存档,但有一种排除选项(如这里所要求的)。

如果您也需要子模块,这应该可以做到:https://github.com/meitar/git-archive-all.sh/wiki

可能最简单的方法是使用git存档。如果你真的只需要扩展的树,你可以这样做。

git archive master | tar -x -C /somewhere/else

大多数时候,我需要从git中“导出”一些东西,无论如何,我都需要一个压缩的存档,所以我会这样做。

git archive master | bzip2 >source-tree.tar.bz2

ZIP存档:

git archive --format zip --output /full/path/to/zipfile.zip master 

git帮助存档,它非常灵活。


请注意,即使存档文件不包含.git目录,但它也会包含其他隐藏的特定于git的文件,如.gitignore、.gitattributes等。如果您不希望它们在存档文件中,请确保在.gitattr文件中使用export-ignore属性,并在进行存档之前提交该属性。阅读更多。。。


注意:如果您对导出索引感兴趣,命令是

git checkout-index -a -f --prefix=/destination/path/

(更多详情请参见Greg的回答)

我只是想指出,如果你是

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

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