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

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

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


当前回答

如果存储库托管在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

其他回答

我的首选实际上是在Makefile(或其他构建系统)中有一个dist目标,它可以导出代码的可分发存档(.tar.bz2、.zip、.jar或其他合适的文件)。如果您碰巧使用GNU自动工具或Perl的MakeMaker系统,我认为这是自动存在的。如果没有,我强烈建议添加它。

ETA(2012-09-06):哇,一票否决。我仍然认为,使用构建工具而不是源代码控制工具来构建发行版更好。我相信使用构建工具构建工件。在我目前的工作中,我们的主要产品是以蚂蚁为目标构建的。我们正处于切换源代码控制系统的过程中,这个蚂蚁目标的出现意味着迁移过程中少了一点麻烦。

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

简单到克隆,然后删除.git文件夹:

git克隆url_of_your_repo路径到导出&&rm-rf路径到导出/.git

正如我所理解的那样,它更多的是从服务器上下载特定的状态,没有历史记录,也没有其他分支的数据,而不是从本地存储库中提取状态(就像这里的许多用户一样)。

可以这样做:

git clone -b someBranch --depth 1 --single-branch git://somewhere.com/repo.git \
&& rm -rf repo/.git/

--自Git 1.7.10(2012年4月)以来,单一分支可用。--据报道,深度有问题,但就出口而言,上述问题应该无关紧要。

对于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