簡體   English   中英

Git 差異和復制

[英]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

結果,您將所有這些文件都放在一個目錄中(沒有目錄樹)。 另一個問題是這真的是你需要的。

首先,您當前解決方案的問題:

  1. xargs不能很好地處理包含空格的文件名。您現在可能沒有這個問題,您可以解決它,但如果可能的話最好避免這種情況。
  2. cp不會構建目錄樹-您可以輕松驗證-因此無論如何它都不會按照您的要求進行操作。
  3. git不會產生相對於當前路徑的路徑名,而是相對於工作樹的基礎。
  4. git diff $BITBUCKET_PR_DESTINATION_BRANCH $BITBUCKET_BRANCH生成的文件名甚至不必存在於您的工作樹中,而只存在於(至少一個)分支中。
  5. 如果文件的兩個版本之間存在差異,那么您還沒有說要復制哪個版本!

使用標准文件工具的功能腳本如下所示:

#!/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 中可能有更好的方法來做到這一點,但我不知道。

如果你有cpxargs的 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.

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