Git diff --name-only并复制该列表

Baz*_*zZy 148 git

我只想获得两个修订版之间已更改文件的列表,这很简单:

git diff -–name-only commit1 commit2 > /path/to/my/file
Run Code Online (Sandbox Code Playgroud)

但是,如果我想将所有列出的文件复制到另一个地方,我该怎么写?我需要完全相同的目录结构复制文件.

例如,我修改并添加了文件:

/protected/texts/file1.txt
/protected/scripts/index.php
/public/pics/pic1.png
Run Code Online (Sandbox Code Playgroud)

我希望在/home/changes/所有更改和添加的文件中包含:

/home/changes/protected/texts/file1.txt
/home/changes/protected/scripts/index.php
/home/changes/public/pics/pic1.png
Run Code Online (Sandbox Code Playgroud)

Yor*_*ork 113

尝试以下命令,我测试过:

$ cp -pv --parents `git diff --name-only` DESTINATION-DIRECTORY
Run Code Online (Sandbox Code Playgroud)

  • 感谢``cp --parents''的提示,我多年来一直希望使用该选项,但从未知道它的存在!..很显然,我从不费心去找它,要么= \ (2认同)
  • 请注意,这在Mac上不起作用,因为`cp`的`--parents`选项不可用。 (2认同)

Mar*_*air 13

以下应该工作正常:

git diff -z --name-only commit1 commit2 | xargs -0 -IREPLACE rsync -aR REPLACE /home/changes/protected/
Run Code Online (Sandbox Code Playgroud)

进一步解释:

  • -zgit diff --name-only同NUL分隔的文件的方式输出列表字节而不是换行,以防万一您的文件名中都有特殊字符.

  • -0xargs说,解释标准作为输入参数的NUL分隔的列表.

  • -IREPLACE是必需的,因为默认情况下xargs会将参数附加到rsync命令的末尾.相反,它说要把它们放在后者的REPLACE位置.(这是服务器故障答案的一个很好的提示.)

  • -a对参数rsync的手段维护权限,所有权等如果可能的话.的-R手段来创建在目标文件时使用完整的相对路径.

更新:如果您有旧版本xargs,则需要使用该-i选项而不是-I.(前者在以后的版本中被弃用findutils.)


kol*_*pto 11

这是一个单行:

列出已更改的文件并将其打包为*.zip:

git diff --name-only | zip patched.zip -@
Run Code Online (Sandbox Code Playgroud)

列出上次提交的已更改文件并将其打包为*.zip:

git diff --name-only HEAD~ HEAD | zip patched.zip -@
Run Code Online (Sandbox Code Playgroud)


Mar*_*ark 6

zip update.zip $(git diff --name-only commit commit)
Run Code Online (Sandbox Code Playgroud)