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

时间:2018-08-07 04:36:57

标签: bash git shell git-diff

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

     

索引7820f3d..5a0e484 100644

     

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

     

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

     

@@ -1 +1,5 @@

     

-此文件夹包含常用的数据库脚本。

     

\文件末尾没有换行符

     

+此文件夹包含常见的数据库脚本。

     

+测试站

     

\文件末尾没有换行符

因此,在上面的响应中,仅是换行的行/文本或两个分支之间的差异是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 \\

以上命令返回以下响应:

  

-此文件夹包含常用的数据库脚本。

     

+此文件夹包含常见的数据库脚本。

     

+测试站

但是我只希望存储差异TEST STTESA

2 个答案:

答案 0 :(得分:1)

您可以轻松地意识到,您的解决方案并非每次都有效。 grep -v部分使其无法携带。

这是一个“ step0”解决方案:您希望匹配以“ +”或“-”开头的行,然后匹配“ +”或“-”的行。为此使用grep

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

一些解释: 首先,中间的\|部分是一个“或”语句。 然后,每一面都以^开始,该行指向行的开头。最后,在第一个字符之后,我们想使用[^...]语法拒绝某些字符。

上面的行翻译为英语,表示“运行差异,并找到所有以+开头,后跟不是+或以{{ 1}},然后输入非-

如果您删除以-开头的行,这将无法正常工作。也不要添加以-开头的行。 对于这样的场景,我会喜欢+并为其中一些添加git diff --color来有趣。

答案 1 :(得分:1)

-diff-filter = [ACDMRTUXB *]

仅选择符合以下条件的文件

  • 已添加
  • C复制
  • D已删除
  • M修改
  • R重命名
  • T的类型(模式)已更改
  • U未合并
  • X未知
  • B的配对坏了
  • 和*全或无