协慌网

登录 贡献 社区

做一个 “git export”(比如 “svn export”)?

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

  1. git clone然后删除.git存储库目录。
  2. git checkout-index暗示了这个功能,但是从 “只需将所需的树读入索引......” 开始,我不完全确定如何做。
  3. git-export是第三方脚本,它基本上将git clone放入临时位置,然后将rsync --exclude='.git'放入最终目标。

这些解决方案都没有让我感到满意。与svn export最接近的一个可能是选项 1,因为这两个都要求目标目录首先为空。但是选项 2 看起来更好,假设我可以弄清楚将树读入索引意味着什么。

答案

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

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 help archive了解更多细节,它非常灵活。


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


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

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

(有关详细信息,请参阅Greg 的回答

我发现了 2 选项意味着什么。从存储库中,您可以执行以下操作:

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

路径末尾的斜杠很重要,否则会导致文件位于 / destination 中,前缀为 “path”。

由于在正常情况下索引包含存储库的内容,因此 “将所需的树读入索引” 没有什么特别之处。它已经存在了。

-a标志是检查索引中的所有文件所必需的(我不确定在这种情况下省略此标志意味着什么,因为它不能做我想要的)。 -f标志强制覆盖输出中的任何现有文件,此命令通常不会执行此操作。

这似乎是我正在寻找的那种 “git export”。

git archive也适用于远程存储库。

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