在Git中仅导出具有文件夹结构的已修改和添加的文件

Mic*_*ica 73 git git-diff

我想在特定提交中获取已修改和添加的文件的列表,以便我可以导出它们并生成具有文件结构的包.

想法是获取包并在服务器上提取它.由于许多原因,我无法创建一个钩子来自动拉回存储器,并且我必须保持服务器更新的最简单方法是生成此包.

Ari*_*zis 98

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id
Run Code Online (Sandbox Code Playgroud)
  1. git diff-tree -r $commit_id:

    将给定提交的差异取为其父(包括所有子目录,而不仅仅是顶层目录).

  2. --no-commit-id --name-only:

    不输出提交SHA1.仅输出受影响文件的名称而不是完整差异.

  3. --diff-filter=ACMRT:

    仅显示在此提交中添加,复制,修改,重命名或更改其类型的文件(例如,文件→符号链接).这会遗漏已删除的文件.

  • @Taverneiro你可以将它传递给[这个答案中给出的[tar命令](http://stackoverflow.com/questions/2597875/how-can-i-build-a-tar-from-stdin),例如.对于tgz文件:`git diff-tree -r --no-commit-id --name-only --diff-filter = ACMRT $ commit_id | tar -czf file.tgz -T -` (8认同)
  • 您可以通过 git archive 创建 zip 文件: git archive -o upadate.zip HEAD $(git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT <comit_id> ) (2认同)

小智 66

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id | xargs tar -rf mytarfile.tar
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,这里是用tar命令的命令.这会将文件导出到tar存档中.

  • 当尝试向同一个tar文件添加多个提交时,有时tar会再次使用其他名称(filename1.ext)创建filename.ext.我意识到,如果我使用zip,我可以添加并覆盖文件,如果它存在于zip ...你只需要用xargs替换xargs zip -r0 myzipfile.zip $ 1 (3认同)
  • 棒极了! (2认同)

MM.*_*MM. 39

这是一个适用于Windows 7的单行命令.从存储库的顶级文件夹运行它.

for/f"usebackq tokens =*"%A in(`git diff-tree -r --no-commit-id --name-only --diff-filter = ACMRT HEAD~1 HEAD`)do echo FA | xcopy "%~fA""C:\ git_changed_files \%A"

  • echo FA回答关于您是复制文件还是目录(文件)的不可避免的xcopy问题,以及有关覆盖文件的可能问题(覆盖全部)
  • usebackq允许我们使用git命令的输出作为do子句的输入
  • HEAD~1 HEAD获取前一次提交和当前HEAD之间的所有差异
  • %~fA将git输出转换为完全限定的路径(需要将正斜杠更改为反斜杠)
  • C:\ git_changed_files \是您可以找到所有不同文件的地方

  • 对于那些(对我而言)不熟悉Windows批处理文件的所有人来说,如果你想在批处理文件中使用上述命令,你需要在for循环中用%% A替换%A (3认同)

Nic*_*ine 30

如果您的提交哈希是例如a9359f9,则此命令:

git archive -o patch.zip a9359f9 $(git diff --name-only a9359f9^..a9359f9)

将提取在提交中修改的文件并将它们放在patch.zip中,同时保持项目目录结构不变.

有点冗长,提交哈希被提到三次,但它似乎对我有用.

得到它:http://tosbourn.com/2011/05/git/using-git-to-create-an-archive-of-changed-files/

  • @BenSewards用于commit1和commit2*之间的提交范围(包括以后的提交,不包括先前提交;顺序无关紧要)*只需执行`git archive -o patch.zip HEAD/**或commit**/$ (git diff --name-only commit1 commit2)`.传递给`archive`命令的提交可以是任意提交*(很可能是HEAD或更高版本的提交)*,并且文件被拉出,好像它们在该提交阶段被检出一样.传递给`diff`的*commit1*和*commit2*仅用于生成要提取的文件列表 - 它们不会影响所提取文件的版本. (3认同)
  • 由于路径名中的空格,我不得不使用管道来处理NUL的xargs`git diff -z --name-only commit1 commit2 | xargs -0 git archive -o patch.zip HEAD` (3认同)
  • 伙计……我拥有你一瓶啤酒 :) (2认同)

Wen*_*del 19

您可以使用Tortoise Git将差异导出到MS Windows:

我右键单击并选择TortoiseGit > 显示日志日志消息将打开.

选择两个修订并进行比较.之间的区别将是开放的.

选择文件并将选择导出到...到文件夹!

在此输入图像描述


pie*_*etr 7

我需要更新我的测试服务器并添加自2.1版以来更改的文件.
对我来说,像James Ehly发布的那样处理类似的解决方案,但在我的情况下,我想导出两个旧标签之间差异的存档包 - tag_ver_2.1和tag_ver_2.2不是唯一一个提交.

例如:

tag_ver_2.1 = 1f72b38ad
tag_ver_2.2 = c1a546782

这是修改过的示例:

git diff-tree -r --no-commit-id --name-only c1a546782 1f72b38ad | xargs tar -rf test.tar
Run Code Online (Sandbox Code Playgroud)


me_*_*str 7

以下命令对我有用。

如果您希望上次提交更改的文件有所不同:

git archive -o update.zip HEAD $(git diff --name-only HEAD HEAD^)
Run Code Online (Sandbox Code Playgroud)

或者如果您想要两个特定提交之间的差异:

git archive -o update.zip sha1 $(git diff --name-only sha1 sha2)
Run Code Online (Sandbox Code Playgroud)

或者如果您有未提交的文件,请记住 git 的方式是提交所有内容,分支很便宜:

git stash
git checkout -b feature/new-feature
git stash apply
git add --all
git commit -m 'commit message here'
git archive -o update.zip HEAD $(git diff --name-only HEAD HEAD^)
Run Code Online (Sandbox Code Playgroud)