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

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

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


当前回答

我只是想指出,如果你是

导出存储库的子文件夹(这就是我使用SVN导出功能的方式)可以将该文件夹中的所有内容复制到部署目标因为您已经有了整个存储库的副本。

然后,您可以只使用cpfoo[destination]而不是前面提到的gitarchive-master foo|-x-C[destination。

其他回答

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

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

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

我的.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
}

如果您在希望创建导出的计算机上有存储库的本地副本,我还有另一个解决方案可以正常工作。在这种情况下,移动到此存储库目录,并输入以下命令:

GIT_WORK_TREE=输出目录数字检出-f

如果您使用git存储库管理网站,并且希望在/var/www/中签出一个干净的版本,这一点特别有用。在这种情况下,将此命令添加到.git/hook/post-rereceive脚本中(在裸存储库上使用hook/post-Rereceive,这更适合这种情况)

我只是想指出,如果你是

导出存储库的子文件夹(这就是我使用SVN导出功能的方式)可以将该文件夹中的所有内容复制到部署目标因为您已经有了整个存储库的副本。

然后,您可以只使用cpfoo[destination]而不是前面提到的gitarchive-master foo|-x-C[destination。

如果不排除具有.gitattributes导出忽略的文件,请尝试git签出

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout -f -q

-f级从索引中检出路径时,不要在未合并时失败条目;相反,将忽略未合并的条目。

and

-问避免冗长

此外,您可以从SVN中的特定提交修订中获取任何分支或标记,只需添加SHA1即可(Git中的SHA1相当于SVN中版本号)

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout 2ef2e1f2de5f3d4f5e87df7d8 -f -q -- ./

/path/to/checkout/必须为空,Git不会删除任何文件,但会在没有任何警告的情况下覆盖同名文件

更新:为了避免斩首问题,或者在使用签出导出标签、分支或SHA1时保持工作存储库的完整性,需要添加--./最后

双破折号——告诉git破折号后面的所有内容都是路径或文件,在本例中,告诉git签出不更改HEAD

示例:

该命令将仅获取libs目录以及来自该提交的readme.txt文件

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout fef2e1f2de5f3d4f5e87df7d8 -f -q -- ./libs ./docs/readme.txt

这将在头部HEAD^2后面创建(覆盖)my_file_2_behind_HEAD.txt两次提交

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout HEAD^2 -f -q -- ./my_file_2_behind_HEAD.txt

获取其他分支的导出

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout myotherbranch -f -q -- ./

注意。/相对于存储库的根