簡體   English   中英

Git diff --name-only 並復制該列表

[英]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 字節而不是換行符分隔的文件列表,以防萬一您的文件名中有不尋常的字符。

  • -0xargs表示將標准輸入解釋為以 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM