过滤来自 "git diff" 命令的响应以仅获取 Shell 中的差异 - 动态解决方案

Filter response from "git diff" command to get only the difference in Shell - Dynamic Solution

我正在尝试在我的项目中自动执行冗余部署过程。为了实现这一点,我试图使用 "git diff" 来区分两个分支——不知何故,我可以使用以下命令来实现。

git diff <BRANCH_NAME1> -- common_folder_name/ <BRANCH_NAME2> -- common_folder_name/ > toStoreResponse.txt`

现在我得到的响应如下所示:

diff --git a/cmc-database/common/readme.txt b/cmc-database/common/readme.txt

index 7820f3d..5a0e484 100644

--- a/cmc-database/common/readme.txt

+++ b/cmc-database/common/readme.txt

@@ -1 +1,5 @@

-This folder contains common database scripts.

\ No newline at end of file

+This folder contains common database scripts.

+TEST STTESA

\ No newline at end of file

所以在上面的响应中只有 line/text 是一个新行或者两个分支之间的区别是 TEST STTESA 我只想在一些不同的文本文件中存储那么多的文本使用 shell / git 方式。

即名为 readme.txt 的文件将仅包含 TEST STTESA 内容。

解决方案:

我找到了一种解决方法来过滤响应 - 但它并不是我想要的 100%。命令如下所示:

git diff <Branch_Name1> -- common-directory/ <Branch_Name2> -- common-directory/ | grep -v common-directory | grep -v index | grep -v @ | grep -v \

上面的命令returns下面的响应:

-This folder contains common database scripts.

+This folder contains common database scripts.

+TEST STTESA

但我希望能够只存储 TEST STTESA

的差异

您很容易意识到,您的解决方案并非每次都有效。 grep -v 部分使其不可移植。

这是一个 "step0" 解决方案:您想要匹配以“+”或“-”开头且既不是“+”也不是“-”的行。使用 grep !

git diff ... | grep  "^+[^+]\|^-[^-]"

一些解释: 首先,中间的 \| 部分是 "or" 语句。 然后,每一边都以 ^ 开头,它指的是行的开头。最后,在第一个字符之后,我们要使用 [^...] 语法拒绝一些字符。

上面的行翻译成英语为“运行 diff,并找到所有以 + 开头的行,后跟不是 + 的内容,或者以 - 开头,后跟不是 -.

的内容

如果删除以 - 开头的行,这将无法正常工作。如果您添加以 + 开头的行,也不会。 对于这样的场景,我会用 git diff --color 和 grep 一些 [32m 来找乐子。

--diff-filter=[ACDMRTUXB*]

Select 只有

的文件
  • 已添加
  • 已复制
  • D 已删除
  • M 修改
  • R 重命名
  • 他们的类型(模式)改变了
  • U 未合并
  • X 未知
  • B 的配对损坏了
  • and * All-or-none