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

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

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


当前回答

我为git签出索引编写了一个简单的包装器,您可以这样使用:

git export ~/the/destination/dir

如果目标目录已经存在,则需要添加-f或--force。

安装简单;只需将脚本放到PATH中的某个位置,并确保它是可执行的。

git导出的github存储库

其他回答

在寻找导出git存储库的方法时,我经常点击这个页面。我对这个问题的回答考虑了svn导出与git相比在设计上具有的三个财产,因为svn遵循集中存储库方法:

通过不导出所有修订,它可以最大限度地减少到远程存储库位置的流量它不在导出目录中包含元信息使用svn导出某个分支是通过指定适当的路径来完成的gitclone--深度1--分支主git://git.somewhere目的地路径rm-rf目标路径/.git

在构建某个版本时,克隆一个稳定的分支是很有用的,例如--branch stable或--branch release/0.9。

gitarchive还可以与远程存储库一起使用。

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master | tar -xf -

要导出repo中的特定路径,请向git添加任意数量的路径作为最后一个参数,例如:

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv

选项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存档,但有一种排除选项(如这里所要求的)。

从Git手册:

使用git签出索引“导出整个树”

前缀功能基本上使使用git签出索引作为“导出为树”函数变得简单。只需将所需的树读入索引,然后执行以下操作:

$git签出索引--prefix=git导出目录/-a

我发现了选项2的含义。从存储库中,您可以执行以下操作:

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

路径结尾处的斜线很重要,否则将导致文件位于带有前缀“path”的/target中。

因为在正常情况下,索引包含存储库的内容,所以“将所需的树读入索引”没有什么特别的事情可做。它已经在那里了。

签出索引中的所有文件都需要-a标志(我不确定在这种情况下省略此标志意味着什么,因为它不能满足我的需要)。-f标志强制覆盖输出中的任何现有文件,而此命令通常不会这样做。

这似乎是我想要的那种“git导出”。