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

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

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


当前回答

这样做很简单,这是.bash_profile的一个函数,它直接在当前位置解压缩存档文件,首先配置您常用的[url:path]。注意:使用此功能可以避免克隆操作,它直接从远程存储库获取。

gitss() {
    URL=[url:path]

    TMPFILE="`/bin/tempfile`"
    if [ "$1" = "" ]; then
        echo -e "Use: gitss repo [tree/commit]\n"
        return
    fi
    if [ "$2" = "" ]; then
        TREEISH="HEAD"
    else
        TREEISH="$2"
    fi
    echo "Getting $1/$TREEISH..."
    git archive --format=zip --remote=$URL/$1 $TREEISH > $TMPFILE && unzip $TMPFILE && echo -e "\nDone\n"
    rm $TMPFILE
}

.gitconfig的别名,需要相同的配置(注意在.git项目中执行命令,它总是跳转到前面所说的基本目录,直到修复为止,我个人更喜欢这个函数

ss = !env GIT_TMPFILE="`/bin/tempfile`" sh -c 'git archive --format=zip --remote=[url:path]/$1 $2 \ > $GIT_TMPFILE && unzip $GIT_TMPFILE && rm $GIT_TMPFILE' -

其他回答

如果不排除具有.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 -- ./

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

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

git export ~/the/destination/dir

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

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

git导出的github存储库

如果存储库托管在GitHub上,则为特殊情况。

只需使用svn导出。

据我所知,Github不允许存档--远程。虽然GitHub是svn兼容的,而且他们确实有所有的git repos svn可访问,所以你可以像平常一样使用svn导出,只需对GitHub url进行一些调整。

例如,要导出整个存储库,请注意URL中的主干如何替换master(或项目的HEAD分支设置为什么):

svn export https://github.com/username/repo-name/trunk/

您可以导出单个文件,甚至导出某个路径或文件夹:

svn export https://github.com/username/repo-name/trunk/src/lib/folder

jQuery JavaScript库示例

HEAD分支或主分支将使用主干:

svn ls https://github.com/jquery/jquery/trunk

非HEAD分支机构可在/branches/下访问:

svn ls https://github.com/jquery/jquery/branches/2.1-stable

/tags/下的所有标签以相同的方式:

svn ls https://github.com/jquery/jquery/tags/2.1.3

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

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

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

这将复制除.dot文件之外的所有内容。我使用这个将git克隆项目导出到我的web应用程序的git repo中,而不使用.git文件。

cp-R/git repo/path/to/destination的路径/

简单的旧bash非常有用:)