【问题标题】:Git export exactly like SVN exportGit 导出与 SVN 导出完全一样
【发布时间】:2013-11-25 16:09:07
【问题描述】:

是否可以仅从远程 Git 存储库中导出单个修订版中的文件?在 Subversion 中,我们可以很容易地做到这一点:

svn export https://some.website.com/trunk/app/etc@5317 --username=user --password=pass  --force -r 5317 ./build/trunk/app

这只会给我在修订版 5317 中更改的文件,而不是其他文件。为什么这在 Git 中不可能?

注意:我已经阅读了How to do a “git export” (like “svn export”),但所有答案都涉及克隆整个存储库的一些变体。我不需要整个工作树。我只需要一些文件。我的存储库是 4.5 gigs,我的 FTP 构建系统托管在 VM 上,对入站收费并且磁盘空间有限。任何帮助表示赞赏。

【问题讨论】:

  • "这将只给我在修订版 5317 中更改的文件,没有其他内容。" - 您确定这不会为您提供 5316 版中存在且在 5317 版中未更改的文件吗?

标签: git build-system svn-export


【解决方案1】:

这只会给我在修订版 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

git 进行最小获取的方法是从浅克隆开始。可以以 事后 的方式执行此操作,甚至可以完全避免在对象数据库中包含任何内容,但除非磁盘空间非常可笑,否则 git 方式可以从远程执行此操作网站是

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

从那时起,就

git pull

保持最新

【讨论】:

  • 谢谢 jthill,这正是我想要的
【解决方案2】:

man git-archive

另见this related question

之后,你就可以随心所欲了,例如:

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

【讨论】:

  • -1 因为 git archive 不能在远程仓库上运行,它需要先克隆。
  • 在 git-archive 的手册页中,我可以看到选项 --remote,其解释如下: --remote= 不是从本地存储库制作 tar 存档,而是检索来自远程存储库的 tar 存档。我正在使用 1.8.4.3。公平地说,当我第一次回答时,我不知道,当我看到您的评论时,只是查看了手册页。也许最近添加了一些东西?
  • this,也。
  • 问题是,这将获取所有文件,而不是所有更改的文件。
  • @jthill 我理解这个问题的方式,他想要一个修订版的所有文件。他说:“是否可以从远程 Git 存储库中仅导出单个修订版中的文件?”。随后的 "[...] only the files that are changed in revision 5317" 可能会造成混淆并导致您的解释,但我仍然认为作者的初衷只是为了获得特定的修订,与它的所有文件。
【解决方案3】:

你可以使用这个工具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

【讨论】:

    【解决方案4】:

    使用--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 repo 中的一些路径

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

    如果您希望在 dest 文件夹中创建部分文件夹结构(用于子路径)

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2010-10-06
      • 2013-11-21
      相关资源
      最近更新 更多