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

时间:2011-04-09 13:36:49

标签: git

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

git diff -–name-only commit1 commit2 > /path/to/my/file

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

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

/protected/texts/file1.txt
/protected/scripts/index.php
/public/pics/pic1.png

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

/home/changes/protected/texts/file1.txt
/home/changes/protected/scripts/index.php
/home/changes/public/pics/pic1.png

7 个答案:

答案 0 :(得分:109)

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

$ cp -pv --parents `git diff --name-only` DESTINATION-DIRECTORY

答案 1 :(得分:13)

以下应该可以正常工作:

git diff -z --name-only commit1 commit2 | xargs -0 -IREPLACE rsync -aR REPLACE /home/changes/protected/

进一步解释:

  • -z to with git diff --name-only表示输出以NUL字节而不是换行符分隔的文件列表,以防万一您的文件名中包含异常字符。

    < / LI>
  • -0xargs表示将标准输入解释为NUL分隔的参数列表。

  • 需要-IREPLACE,因为默认情况下xargs会将参数附加到rsync命令的末尾。相反,它表示将它们放在后面的REPLACE所在的位置。 (这是来自this Server Fault answer的一个很好的提示。)

  • -a rsync参数意味着在可能的情况下保留权限,所有权等。 -R表示在目标中创建文件时使用完整的相对路径。

更新:如果您使用旧版xargs,则需要使用-i选项而不是-I。 (前者在findutils的更高版本中已弃用。)

答案 2 :(得分:11)

这是一个单行:

列出已更改的文件&amp;将它们打包为* .zip:

git diff --name-only | zip patched.zip -@

列出上次提交的已更改文件&amp;将它们打包为* .zip:

git diff --name-only HEAD~ HEAD | zip patched.zip -@

答案 3 :(得分:5)

zip update.zip $(git diff --name-only commit commit)

答案 4 :(得分:2)

#!/bin/bash
# Target directory
TARGET=/target/directory/here

for i in $(git diff --name-only)
    do
        # First create the target directory, if it doesn't exist.
        mkdir -p "$TARGET/$(dirname $i)"
        # Then copy over the file.
        cp -rf "$i" "$TARGET/$i"
    done

https://stackoverflow.com/users/79061/sebastian-paaske-t%c3%b8rholm

答案 5 :(得分:2)

效果很好。

git diff 1526043 82a4f7d --name-only | xargs zip update.zip

git diff 1526043 82a4f7d --name-only |xargs -n 10 zip update.zip

答案 6 :(得分:1)

没有人提到cpio,它很容易输入,创建硬链接并处理文件名中的空格:

git diff --name-only $from..$to  | cpio -pld outdir