我只想获得两个修订版之间已更改文件的列表,这很简单:
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
答案 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字节而不是换行符分隔的文件列表,以防万一您的文件名中包含异常字符。
-0
到xargs
表示将标准输入解释为NUL分隔的参数列表。
需要-IREPLACE
,因为默认情况下xargs
会将参数附加到rsync
命令的末尾。相反,它表示将它们放在后面的REPLACE
所在的位置。 (这是来自this Server Fault answer的一个很好的提示。)
-a
rsync
参数意味着在可能的情况下保留权限,所有权等。 -R
表示在目标中创建文件时使用完整的相对路径。
更新:如果您使用旧版xargs
,则需要使用-i
选项而不是-I
。 (前者在findutils
的更高版本中已弃用。)
答案 2 :(得分:11)
这是一个单行:
列出已更改的文件&将它们打包为* .zip:
git diff --name-only | zip patched.zip -@
列出上次提交的已更改文件&将它们打包为* .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