过滤来自 "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
我正在尝试在我的项目中自动执行冗余部署过程。为了实现这一点,我试图使用 "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