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

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

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


当前回答

可能最简单的方法是使用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相比,Git的问题更小。Git只在存储库根目录中放置.Git文件夹,而SVN在每个子目录中放置.SVN文件夹。因此,“svn-export”避免了递归命令行魔法,而使用Git递归则是不必要的。

这将把一系列提交(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

在添加前缀(例如目录名)时将git导出到zip存档:

git archive master --prefix=directoryWithinZip/  --format=zip -o out.zip

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

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

如果存储库托管在GitHub上,则为特殊情况。

只需使用svn导出。

据我所知,Github不允许存档--远程。虽然GitHub是svn兼容的,而且他们确实有所有的git repos svn可访问,所以你可以像平常一样使用svn导出,只需对GitHub url进行一些调整。

例如,要导出整个存储库,请注意URL中的主干如何替换master(或项目的HEAD分支设置为什么):

svn export https://github.com/username/repo-name/trunk/

您可以导出单个文件,甚至导出某个路径或文件夹:

svn export https://github.com/username/repo-name/trunk/src/lib/folder

jQuery JavaScript库示例

HEAD分支或主分支将使用主干:

svn ls https://github.com/jquery/jquery/trunk

非HEAD分支机构可在/branches/下访问:

svn ls https://github.com/jquery/jquery/branches/2.1-stable

/tags/下的所有标签以相同的方式:

svn ls https://github.com/jquery/jquery/tags/2.1.3