[英]Git Diff and Copy
我想針對在 bitbucket 上的拉取請求中添加或修改的文件運行靜態代碼分析 (PMD) 報告。 已修改的文件等在管道映像中本地可用,但是我需要執行 git diff 以僅識別源分支(從中提取)和目標分支(要合並到)之間的更改。 然后,我將對一個僅包含“已更改文件”的目錄執行 PMD CLI(帶有規則集等),以突出這些文件的任何問題,特別是作為更改的一部分。
我基本上想復制 git diff 結果中指示的文件。 我希望這能提供更多背景信息。
我已經嘗試找到一些示例並進行了測試,但是由於我對這些瘋狂的 linux 命令缺乏了解,我只是沒有做對:)
到目前為止,我有以下命令,但結果是一個空文件夾。
git diff --name-only --pretty $BITBUCKET_PR_DESTINATION_BRANCH $BITBUCKET_BRANCH | xargs -i {} cp {} -t ~/branch-diff/
xargs 可能會對多個文件有問題 - 參數太大。 我提出類似的建議
for name in $(git diff --name-only --pretty $BITBUCKET_PR_DESTINATION_BRANCH $BITBUCKET_BRANCH); do cp $name ~/branch-diff/; done
結果,您將所有這些文件都放在一個目錄中(沒有目錄樹)。 另一個問題是這真的是你需要的。
首先,您當前解決方案的問題:
xargs
不能很好地處理包含空格的文件名。您現在可能沒有這個問題,您可以解決它,但如果可能的話最好避免這種情況。cp
不會構建目錄樹-您可以輕松驗證-因此無論如何它都不會按照您的要求進行操作。git
不會產生相對於當前路徑的路徑名,而是相對於工作樹的基礎。git diff $BITBUCKET_PR_DESTINATION_BRANCH $BITBUCKET_BRANCH
生成的文件名甚至不必存在於您的工作樹中,而只存在於(至少一個)分支中。使用標准文件工具的功能腳本如下所示:
#!/bin/bash
# diffcopy.sh
#
DESTDIR="$1"
BRANCH1="$2"
BRANCH2="$3"
# so relative paths match git output
SRCDIR="$(git rev-parse --show-toplevel)"
# choose the branch whose files we want to copy
git checkout "$BRANCH2"
# make the output directory
mkdir -p "$DESTDIR"
# sync the changed files
rsync -a --files-from=<(git diff --name-only "${BRANCH1}".."${BRANCH2}") "$SRCDIR" "$DESTDIR"
# restore working copy
git checkout -
純粹在 git 中可能有更好的方法來做到這一點,但我不知道。
如果你有cp
和xargs
的 GNU 變體,你可以這樣做:
git diff --name-only -z $BITBUCKET_PR_DESTINATION_BRANCH $BITBUCKET_BRANCH |
xargs -0 cp --target-directory="$HOME/branch-diff/" --parents
這不會為每個文件生成一個cp
,而是使用一個cp
進程復制盡可能多的文件。 通過指定--target-directory
,目標可以在cp
命令的前面出現,並且xargs
可以根據需要在cp
命令的 和 粘貼任意數量的源文件名。 --parents
保留源文件的目錄名稱。
git diff
中的-z
用 NUL 字符而不是換行符分隔文件名,並且xargs
的-0
知道如何將 NUL 分隔的路徑列表分開,而不會絆倒文件名中的空白字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.