[英]Git diff --name-only and copy that list
我只想獲取兩個修訂版之間已更改文件的列表,這很簡單:
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
嘗試以下我已經測試過的命令:
$ cp -pv --parents $(git diff --name-only) DESTINATION-DIRECTORY
以下應該可以正常工作:
git diff -z --name-only commit1 commit2 | xargs -0 -IREPLACE rsync -aR REPLACE /home/changes/protected/
進一步解釋:
-z
to 與git diff --name-only
意味着輸出用 NUL 字節而不是換行符分隔的文件列表,以防萬一您的文件名中有不尋常的字符。
-0
到xargs
表示將標准輸入解釋為以 NUL 分隔的參數列表。
-IREPLACE
是必需的,因為默認情況下xargs
會將參數附加到rsync
命令的末尾。 相反,這表示將它們放在后面的REPLACE
所在的位置。 (這是這個 Server Fault answer的一個很好的提示。)
rsync
的-a
參數意味着在可能的情況下保留權限、所有權等。 -R
表示在目標中創建文件時使用完整的相對路徑。
更新:如果您有舊版本的xargs
,則需要使用-i
選項而不是-I
。 (前者在findutils
更高版本中已棄用。)
這是一個單行:
列出更改的文件並將它們打包為 *.zip:
git diff --name-only | zip patched.zip -@
列出最后提交的更改文件並將它們打包為 *.zip:
git diff --name-only HEAD~ HEAD | zip patched.zip -@
zip update.zip $(git diff --name-only commit commit)
#!/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
它完美地工作。
git diff 1526043 82a4f7d --name-only | xargs zip update.zip
git diff 1526043 82a4f7d --name-only | xargs -n 10 zip update.zip
沒有人提到cpio
,它易於鍵入、創建硬鏈接並處理文件名中的空格:
git diff --name-only $from..$to | cpio -pld outdir
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.