I followed this post and I want to get all of the lines of code which were changed, except comments! .
Sample of comments, i want to ignore:
* @copyright Copyright (c) 2006-2017 X.commerce, Inc. and affiliates (http://www.magento.com)
was changed into:
* @copyright Copyright (c) 2006-2018 Magento, Inc. (http://www.magento.com)
Using this command:
`git diff -G [^* @copyright] > diff.txt` , it outputs:
fatal: ambiguous argument '@copyright]': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
How can I get a list of files where other parts of the code were changed , not just only the copyright
part ?
Thank you
答案 0 :(得分:1)
TL; DR:-G
并没有完全满足您的要求,但是请参见Regular expression to match a line that doesn't contain a word?并注意-G
使用POSIX“扩展正则表达式”语法。
您要解决两个不同的问题(以及来自Git的一些无用的文档)。这些问题之一是编写选择所需内容的正则表达式。 RomainVALERI's answer是针对此问题的(不幸的是错过了它),而忽略了另一个问题:-G
不会完全按照您的意愿去做。我先解决这个问题。
git diff
和git log
命令(完全是不同的命令)共享一些源代码和一些文档。 -G
和-S
都激活了Git所说的 pickaxe ,该文件记录在名为gitdiffcore的单独页面中。
当我们运行git log
时,我们遇到一个常见问题:它向我们显示了太多次提交。我们希望看到更少的提交!特别是,我们希望看到影响到代码某些特定部分的提交。这是-G
和-S
最有用的地方:git log -G<regex>
或git log -S<text>
查找提交,如果我们在{em>上运行git show
这些提交,我们将看到一个更改,该更改会影响我们要查找的代码。
请记住,git show <hash>
或多或少地运行git diff <hash>^ <hash>
,以将一次特定提交的父级中的快照与子级中的快照进行比较。也就是说,每个提交都存储了一个完整的快照,因此,通过比较父项中的内容和子项中的内容,我们可以找出发生了什么更改 1 一旦知道了什么更改,便可以在其中搜索某些特定更改。
因此,回到git log
有点:我们可能想找出哪些提交更改了版权日期,以查看它们是否也更改了其他内容。因此,我们将git log -S
或git log -G
查找并列出/显示所有 commits ,其中所有 commits 的差异中都包含一行copyright
。 / em>。这就是这些选项特别擅长的。但这不是您要尝试的。
1 这有点像过去一周中每天的高温图表,然后找出温度变化最大的那一天:减去日对;知道星期一是24°C,星期三是18°C,并不能告诉我们星期二是什么,但是如果星期二是19°C,现在,我们知道它从星期一改变为5星期二,然后从星期二到星期三乘1。同样,使用源代码快照,我们必须从周二的减去周一的快照,以查看周二发生了什么变化。我们必须从周三减去周二,以查看周三发生了什么变化。
现在,当我们在任何两个特定的提交上运行git diff
时,就像这样:
git diff <old-commit> <new-commit>
Git有效地从新提交中减去旧提交,以告诉我们有什么不同。但是,提交由文件组成。两个提交中的每个提交可能有10,000个文件。差异将向我们显示每个文件中的更改,可能是文件的1%或100个文件-但我们可能只对diff中包含单词的文件感兴趣例如“版权” 。
这是镐与-G
一起使用时的镐(-S
或git diff
)的作用:如果git diff
是将向我们显示100具有差异的文件,镐会仅选择包含我们要求其查找的特定更改的文件。因此,如果git diff
可以向我们显示100个文件,但是只有十个在其diff输出中带有“版权”一词,git diff -G copyright <old> <new>
可以向我们显示那些十个文件。
在您的情况下,一旦您找到一个与没有“版权”相匹配的正则表达式,便可以告诉Git:查找更改了其他内容的差异。如果您在git diff
中使用该字词,则会显示完整差异-包括版权更改! 不包含“版权”一词。
那不是你想要的。不过,它可能必须足够好,因为这就是Git可以给您的。
现在,让我们回过头来查找包含不的更改的行,该更改可能在文字星号和空格之后。这比看起来难!我将其外包给regex领域中的一个现有问题,以及其许多答案:Regular expression to match a line that doesn't contain a word? Git使用POSIX 扩展正则表达式或ERE。它们没有负面的环顾四周,因此the method in the first comment或this answer可以完成任务,但接受的答案不会。
答案 1 :(得分:0)
尝试
git diff -G"(^\\\* @copyright)"
将字符串解析为正则表达式时,\\
变成单个\
,而\*
变成*
。