我一直在想,是否有一个好的“gitexport”解决方案可以创建一个没有.git存储库目录的树的副本。我知道至少有三种方法:
git克隆,然后删除.git存储库目录。git签出索引暗示了这一功能,但以“只需将所需的树读入索引……”开头,我不完全确定该怎么做。gitexport是一个第三方脚本,本质上是将git克隆到临时位置,然后再将rsync--exclude='.git'复制到最终目标。
这些解决方案中没有一个让我感到满意。最接近svn导出的可能是选项1,因为两者都要求目标目录首先为空。但选项2似乎更好,假设我能够理解将树读入索引意味着什么。
我发现了选项2的含义。从存储库中,您可以执行以下操作:
git checkout-index -a -f --prefix=/destination/path/
路径结尾处的斜线很重要,否则将导致文件位于带有前缀“path”的/target中。
因为在正常情况下,索引包含存储库的内容,所以“将所需的树读入索引”没有什么特别的事情可做。它已经在那里了。
签出索引中的所有文件都需要-a标志(我不确定在这种情况下省略此标志意味着什么,因为它不能满足我的需要)。-f标志强制覆盖输出中的任何现有文件,而此命令通常不会这样做。
这似乎是我想要的那种“git导出”。
对于GitHub用户,gitarchive--remote方法无法直接工作,因为导出URL是短暂的。您必须向GitHub请求URL,然后下载该URL。卷曲使这变得容易:
curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -
这将在本地目录中提供导出的代码。例子:
$ curl -L https://api.github.com/repos/jpic/bashworks/tarball | tar xzf -
$ ls jpic-bashworks-34f4441/
break conf docs hack LICENSE mlog module mpd mtests os README.rst remote todo vcs vps wepcrack
编辑如果您希望将代码放入特定的现有目录(而不是github中的随机目录):
curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | \
tar xzC /path/you/want --strip 1
这将把一系列提交(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