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

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

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


当前回答

对于GitHub用户,gitarchive--remote方法无法直接工作,因为导出URL是短暂的。您必须向GitHub请求URL,然后下载该URL。卷曲使这变得容易:

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -

这将在本地目录中提供导出的代码。例子:

$ curl -L https://api.github.com/repos/jpic/bashworks/tarball | tar xzf -
$ ls jpic-bashworks-34f4441/
break  conf  docs  hack  LICENSE  mlog  module  mpd  mtests  os  README.rst  remote  todo  vcs  vps  wepcrack

编辑如果您希望将代码放入特定的现有目录(而不是github中的随机目录):

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | \
tar xzC /path/you/want --strip 1

其他回答

如果不排除具有.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提交历史的情况下传递。

git archive --format zip --output /full/path/to/zipfile.zip master 

到目前为止,我看到的最简单的方法(也适用于windows)是gitbundle:

git bundle create/some/bundle/path.bundle--全部

有关更多详细信息,请参阅以下答案:如何通过usb驱动器将git存储库从windows机器复制到linux机器?

从Git手册:

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

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

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

这似乎与SVN相比,Git的问题更小。Git只在存储库根目录中放置.Git文件夹,而SVN在每个子目录中放置.SVN文件夹。因此,“svn-export”避免了递归命令行魔法,而使用Git递归则是不必要的。