Git的确切“svn export”等效命令是什么?

12

对于 git 没有确切的等同于 svn export 命令吗?真的吗?

注意:这不是重复的问题。也就是说,我已经知道并测试了以下命令:

  • git clone --depth 1 <- 仍会下载 .git 文件夹。
  • git checkout-init <- 对于远程库不起作用,它适用于工作副本(因此需要先克隆)。
  • git archive <- 这将是完美的解决方案,因为它有一个 --remote 参数,但它只有 2 种可能的格式:tar 或 zip,因此我需要在下载后解压缩,而这需要一个管道符(|),但我在 Windows 上!(不是 *n?x)
  • git clone --bare <- 我仍然不知道这是什么,但这不是我需要的。

请告诉我,在 git 中是否存在真正的 svn export 替代品?


1
这不是提出问题的重复。基本上,OP正在询问如何仅从远程存储库下载最新文件清单。 git archive 从本地克隆工作,因此回到了起点:如何仅下载最新的清单。 - Lasse V. Karlsen
4
git clone --depth 1 是您需要的,阅读 Bruno 提供的文档和评论即可。 - Lasse V. Karlsen
4
你必须获得一个.git文件夹,但你可以使用--depth 1来避免下载完整的变更历史记录。不过你仍然需要之后删除.git文件夹,这是无法避免的。 - Lasse V. Karlsen
1
如果您在Windows上安装了Git,则可以推测您已经有了Git Bash以及它安装的相关工具,例如tar。如果是这种情况,您可以使用git archive和tar管道。 - CB Bailey
8个回答

13

2
停止提出--depth,它已经在问题中提到了! - knocte
6
不确定你是否理解 --depth 的作用:它不会下载所有的修订版本,而是重新构建一个“虚假”的历史记录,每次都假装添加新文件。你所下载的内容并不比归档文件多。 - Bruno
1
在我看来,对自己的问题的答案进行负投票并不礼貌。 - alternative
2
StackOverflow不是关于礼貌,而是关于正确性。 - knocte
1
@knocte,很惊讶看到你仍然在这个问题上活跃。尽管如此,我的答案是正确的。 - Bruno
显示剩余3条评论

11

问题“如何使用Git进行类似于SVN的‘导出’?”就像是在问“我该如何更换篮球上的轮胎?”你不能这么做,但这并不是篮球的问题。没错,篮球是由橡胶和空气充填而成,但相似之处也随之结束。

只有在Subversion中你才需要使用“导出”操作,因为它会在每个子目录中都生成一个.svn目录。Git并不会这样做,所以实际上你不需要它。一次克隆操作就已经完成了“导出”,只不过是在根目录下多了一个存放整个仓库业务的文件夹。

最简单的方法是先克隆仓库,然后从仓库最顶层目录中删除.git文件夹。这样操作后,它就不再是一个版本库了,只是一个独立的文件夹。

或者,你可以直接忽略Git,只使用你克隆下来的文件。这种方法也可行。


2
无关紧要:删除.git文件夹并不能节省我在第一次下载时可以节省的宝贵时间和带宽。 - knocte
2
除非您的存储库在其历史记录中包含大量二进制文件,否则存储库本身仅比检出的工作目录略大。此外,我可以几乎保证,您花费的时间和带宽抱怨这个问题比按照工具的设计使用它所需的时间和带宽更多。 - Dan Ray
2
DanRay不要假设这个工具的目的。如果我要使用它下载数千个Git存储库,节省带宽是有意义的,对吧? - knocte
2
我有一种感觉,除了“这就是如何使git像您喜欢的工具一样运行”的答案之外,没有其他答案能够令人满意...从设计到实现,git和svn非常不同。 - Dan Ray
4
我读过的其中一个最愚蠢的比喻。对于特定任务(仅下载文件,而不是历史记录,对于特定修订版本),希望具有原子提交功能的版本控制系统具有完成此任务的命令,这种期望具有各种直观意义。使用“svn export”的原因是为了在不包含历史记录的情况下获取修订版本的副本。告诉别人去克隆,获取包含历史记录的副本,然后忽略那个历史记录,最好是轻蔑的。此外,截至2011年发布的版本1.7,SVN不再在每个目录中都出现.svn文件夹。 - Ben
显示剩余5条评论

9

只需从工作副本中删除存储库即可。

git clone remote
rm -Rf .git

(在Windows上,它是rd /s /q。感谢@Bruno的提示。)

1
也许在Windows上使用rd /s /q代替rm -Rf - Bruno
1
这与“粉丝”无关。你想要 svn export 吗?那么必须使用 svn,因为分布式版本控制系统(DVCS)与集中式版本控制系统非常不同。你不能像使用 SVN 一样从 SVN 切换到 Git 并使用它。了解 Git,你就会明白这里发生了什么。或者放弃吧,但不要怪使者 ;) - KingCrunch
KingCrunch,从DVCS的概念上讲,git没有提供这个功能是没有道理的。我可以创建一个补丁,他们会添加这个功能,所以请停止传播错误的结论。 - knocte
@KingCrunch,当然,我认为那很明智,但问题发起人好像不同意。 - Bruno
2
@knocte,当然,这可以直接添加,不一定是个坏主意。然而,git 基本上遵循了 Unix 的方法,即为您需要做的每件小事都有一个小命令,然后您可以将它们组合起来。有些人喜欢这种方法,有些人则不喜欢。我认为 git clone --depth 后跟一个 rmdir 并不是你能得到的最难的命令组合。即使在可能受限的命令行环境下(例如 Windows 的 cmd),也并不难。用一个命令完成可能更好,但我不确定是否值得像这样争论... - Bruno
显示剩余11条评论

3
在一些像GitHub这样的托管平台上,您可以进行精确的svn export操作。
例如:
svn export https://github.com/GNOME/banshee/branches/master

即使是部分仓库(仅限于仓库的某个子部分)也可以进行操作!

例如:

svn export https://github.com/liferay/liferay-portal/branches/6.1.x/tools

对于您自己的存储库,您应该创建一些 GitHub 存储库,并将其添加为远程存储库:

git remote add github https://github.com/<user>/<repo>.git

那么

git push github <branch>

现在您可以像上面那样进行部分结帐。

更新:看起来此功能将被停用


3
@knocte,问题在于这个答案没有回答问题。事实上,“svn export”在GitHub上的运行与使用Git做你想做的事情无关,而是因为GitHub也提供了一个Subversion服务,它是连接到其Git存储库的桥梁。然而,它仍然是一个Subversion服务器,而不是Git服务器。 - Bruno
我知道,但目前这是最好的答案了;我计划在2.0发布后,在git上游贡献一个选项,无论如何都会为此做出贡献(已经贡献了我的第一个补丁,我正在取得进展)。 - knocte
事实仍然存在,git clone --depth 1 your_repo_url 然后删除 .git 存储库仍然可以完全符合您的要求,使用 Git 存储库。当它甚至不使用 Git 存储库时,这个答案怎么可能是“最不糟糕”的呢?我不会因为回答者显然在努力帮助并且这是 GitHub 的一个合理解决方法而对此回答进行贬低评价,但这并没有真正回答问题。 - Bruno
1
该命令并不是“svn export”的完全等价物,因为它需要进行后续清理步骤(删除“.git”文件夹),而原始的Subversion命令则没有这个要求。 - knocte

3

对于我仍然不知道这是什么git clone --bare将克隆没有工作副本的存储库。通常在中央存储库上执行此操作,以最小化磁盘空间使用。

Bruno / King Crunch给出了最好的答案。虽然您可以使用git bash / cygwin来允许您进行一行命令。


这是关于 --depth 1 的相反的内容。 - Paŭlo Ebermann
是的,我意识到了,但是安德烈提到他不知道 git clone --bare 是什么。 - Raoul
我编辑了答案,这样更明显。(而且以这种形式,我甚至可以投票支持它。) - Paŭlo Ebermann

2

这是一个相对较旧的问题,但是我认为没有“显而易见的解决方案”。经过一些git文档的研究,我发现:

git archive --format=tar --remote ... | tar xf -

这将从远程仓库接收内容并将tar归档写入标准输出。然后,tar命令将提取这些内容并在当前目录中创建它们。
如果您想从本地存储库执行此操作(这明确不是问题中要求的请求),那么
git archive --format=tar ... | ( cd /your/path && tar xf - )

这个技巧可以解决你的问题。如果你安装了tar,第一种方法也适用于Windows命令提示符。后者很可能不适用并且可能会覆盖你的目录。


0
有关您的观点,git archive <- This would be the perfect solution ...but it only has 2 possible formats: tar or zip,您可以使用git-archive(1)手册中“EXAMPLES”部分的文档添加新格式:
   git config tar.tar.xz.command "xz -c"
       Configure a "tar.xz" format for making LZMA-compressed tarfiles.
       You can use it specifying --format=tar.xz, or by creating an output
       file like -o foo.tar.xz.

虽然“在Windows上”通常被认为是许多任务的障碍,但通过使用诸如CygwinMKS Toolkit等软件,您可以进行一些额外的工作来追赶运行其他操作系统的人。

如果确认您需要的任何命令都可从您的Shell中使用,但这种git config …命令仍无法为您工作,则您应该在SuperUser.com网站的问题中发布有关配置的其他详细信息。


哇,我简直不敢相信git-archive可以配置自定义格式,但却无法调整为没有任何格式!!!说真的,不是我不知道或不想安装cygwin或其他shell,而是我正在一个构建代理中运行此操作,我不想安装任何东西(因为我实际上对它没有控制权)。 - knocte
1
“没有任何格式”会输出什么?“git archive”的目的是创建一个归档文件。这就需要某种格式。在构建服务器上添加一个免费可用的tar.exe,然后尝试设置git config tar.deploy.command "tar -x -C /path/to/target -f -"并进行即时提取。你所使用的工具都不是完美的。当然,git的架构无法弥补构建环境中的其他故障,但这就是你所拥有的。只需尽力利用现有的工具。 - ghoti
哇,匿名的负评。能否指出这个答案有什么不准确或误导之处? - ghoti
您可以使用 git archive --list 列出安装可用的格式。对于我的安装,我看到了 tar、tez、tar.gz 和 .zip。 - jbruni
@jbruni..是的--在我的系统上,我也看到了.tgz。可能从我2012年使用的格式化方式不太清楚,但第一段中的粗体部分实际上是在引用问题。由于OP明确表示他只有2种可用格式,我试图提供一种添加更多格式的方法。 - ghoti

-1

这个回答没什么用,因为需要从已经克隆的存储库中完成。我们想要避免的是进行两个步骤而不是一个(svn export 是一个步骤,git clone + git checkout-index 是两个步骤)。 - knocte

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