执行“git export”(类似于“svn export”)操作?

2559

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

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

这些解决方案都不是特别令我满意。与svn export最接近的可能是选项1,因为两者都需要首先将目标目录清空。但是选项2似乎更好,只要我能弄清楚将树读入索引意味着什么。


1
@rnrTom:看看Somov的回答。(tar归档中没有任何“压缩”内容)。 - etarion
34
git archive --format zip --output "output.zip" master -0 这个命令会生成一个未压缩的存档文件(-0 是未压缩的标志)。了解更多信息可以查看 http://git-scm.com/docs/git-archive。 - user456814
9
我同意@mrTom的观点,我认为存档是压缩还是未压缩不是主要问题。使用SVN,我可以直接从远程仓库“导出”一个250kB的子目录(否则可能会有200MB的大小,不包括修订版本),那么我只会通过网络下载传输250kB左右。使用git,必须在服务器上启用archive(所以我无法尝试)-从服务器进行“clone --depth 1”的操作仍然可能检索到大小为25 MB的仓库,其中.git子文件夹单独占用了15MB。因此,我的答案仍然是“不行”。 - sdaau
@mrTom,事实上答案是是的。请查看原帖中的回答 - 命令是git checkout-index - nocache
2
这里有一个简单而不错的方法:git archive -o latest.zip HEAD - Evgeni Sergeev
9
我已经将这个问题作为“git export”命令的手册使用多年了。 - orion elenzil
31个回答

1
我在我的 .bashrc 文件中有以下实用函数:它会在 git 仓库的当前分支中创建一个归档文件。
function garchive()
{
  if [[ "x$1" == "x-h" || "x$1" == "x" ]]; then
    cat <<EOF
Usage: garchive <archive-name>
create zip archive of the current branch into <archive-name>
EOF
  else
    local oname=$1
    set -x
    local bname=$(git branch | grep -F "*" | sed -e 's#^*##')
    git archive --format zip --output ${oname} ${bname}
    set +x
  fi
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接