像SVN一样导出Git仓库

3
这是可能的吗?从远程Git存储库中仅导出单个修订版本的文件?在Subversion中,我们可以轻松地做到这一点:
svn export https://some.website.com/trunk/app/etc@5317 --username=user --password=pass  --force -r 5317 ./build/trunk/app

这将只给我提供在版本5317中更改的文件,没有其他文件。为什么Git不支持这种操作?
注意:我已经阅读了如何执行“git export”(类似于“svn export”),但所有答案都涉及克隆整个存储库的某些变体。我不需要整个工作树。我只需要一些文件。我的存储库有4.5 GB,我的托管在虚拟机上的FTP构建系统会对入站流量收费,并具有有限的磁盘空间。任何帮助都将不胜感激。

1
这将只给我那些在修订版5317中发生了变化的文件,而不会给出其他任何内容。- 你确定这不会给你那些在修订版5316中存在且在修订版5317中没有改变的文件吗? - user743382
4个回答

3

这将仅给出在版本5317中更改的文件,而不会有其他内容。为什么Git中没有类似的功能?

没有相应的按钮是因为git fetch或其他几种Git方式更好,但可以通过转储提交中更改的文件的完整内容来实现。

git clone --no-checkout . ../scratch     # dirt cheap
( cd ../scratch
  git diff-tree --name-only -r commit^! | xargs git checkout commit -- 
  git ls-files | tar czTf - ../export.tgz
)
rm -rf ../scratch

在IT技术领域,进行最小化的获取数据操作通常使用git方式。这种方式需要从一个浅克隆中开始。虽然可以事后采取措施来避免在对象数据库中存储任何内容,但是除非磁盘空间非常紧张,否则从远程站点开始使用git方式是最好的选择。

git clone --depth=1 -b mainbranch u://r/l 

自那时起,只需
git pull

保持最新


谢谢jthill,这正是我在寻找的东西。 - user439441

1

请参考 man git-archive

还可以参考这个相关问题

之后,您可以按照自己的意愿进行操作,例如:

git archive --remote=<repo> --output=repo-master.zip master

-1因为git归档在远程仓库上不起作用,需要先克隆。 - user743382
在git-archive的man页中,我可以看到--remote选项,其解释如下:--remote=<repo> 从远程仓库检索tar归档文件,而不是从本地仓库创建tar归档文件。我正在使用1.8.4.3版本。公平地说,我最初回答时并不知道这一点,只是在看到你的评论时查了一下man页。也许最近添加了什么东西? - elmart
请参考这个链接 - elmart
问题是,这将获取所有文件,而不是所有更改的文件。 - jthill
根据我理解这个问题,他想要获取一个单独版本的所有文件。他说:“是否可能从远程 Git 仓库中仅导出某个特定版本的文件?”之后的“[...] 只有在第5317个版本中更改的文件”可能会让人产生困惑,并导致你的解释,但我仍然认为作者最初的意图只是想获得一个特定版本及其所有文件。 - elmart
显示剩余2条评论

0

使用--work-tree

这会强制你同时使用--git-dir来指向你的.git目录。--git-dir=.git假设你在你的git文件夹中。当然,你可以通过调整此文件夹来从任何其他地方调用此命令。

以下命令将检出文件到您选择的任何目录。这不包括现有工作树中的任何本地(未提交)更改。它包括索引中的更改(使用git add添加到其中)

git  --git-dir=.git  --work-tree=/folder/into/which/to/export/  restore  .

使用--source=HEAD来忽略索引。

git  --git-dir=.git  --work-tree=/folder/into/which/to/export/  restore  --source=HEAD  .

或者您可以使用--source来指定任何您想要的提交(分支、标签、哈希值)。

git  --git-dir=.git  --work-tree=/folder/into/which/to/export/  restore  --source=my-tag  .

而且你甚至可以限制在你的git仓库中的某些路径

git  --git-dir=.git  --work-tree=/folder/into/which/to/export/  restore  --source=HEAD:path/in/your/repo  .

如果您想要在目标文件夹中创建子路径的一部分文件夹结构。
git  --git-dir=.git  --work-tree=/folder/into/which/to/export/  restore  --source=HEAD:path/in/  your/repo

仍然只导出 path/in/your/repo。 但会创建目录 /folder/into/which/to/export/your/repo


0
你可以使用这个工具https://github.com/hegoku/git-export,安装它后,当你想要将两个提交之间的修改文件导出到一个文件夹时:
$ git-export -o /home/path_of_folder commit_1 commit_2

或者,如果你只想将特定提交中的修改文件导出到一个文件夹:

$ git-export -o /home/path_fo_folder commit_1

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