如何在不破坏git blame历史的情况下运行样式linter并提交更改?

时间:2019-02-23 17:41:59

标签: git static-analysis

让我先说说我搜索过高低并没有找到好的答案。

如果我的更改仅是将制表符转换为空格,或者运行的脚本可以自动执行所有操作,那么该脚本将起作用:git: change styling (whitespace) without changing ownership/blame?

我想运行任意的交互式清理,例如运行样式填充程序,然后采取人工步骤解决问题,然后如何在不影响git责任的情况下进行提交?我看到有--reset-author,但是事实证明,将所有内容重置为该提交的作者,而不是这种情况所需的内容。

2 个答案:

答案 0 :(得分:1)

您仍然可以使用链接的问题中概述的一般想法,但是您将无法使用git filter-branch运行。好吧,不是直接的。研究the filter-branch script,以了解它如何设置每次提交的 new 提交,以便保留作者和提交者的姓名,电子邮件地址和时间戳,并查看它如何运行树-过滤器。

您必须自己编写一些非常简单的代码,以运行样式样式,然后获得所需的帮助。我看到执行此操作的两条明显路径:

  • 再现过滤器分支的逻辑,但是可以在多次运行中保存状态(例如,将状态保存在文件中)。这样,您可以启动它,告诉它运行直到需要交互,然后在该点终止。现在,您可以修复问题并使用“继续”选项将其调用,使其运行直到再次需要帮助,然后再次停止。重复直到完成。

  • 编写或修改筛选器分支脚本,以便在您的--tree-filter(这是要使用的脚本)中,如果遇到需要人工帮助的情况,它会暂停。 (也许此时,您的树过滤器从命名管道中读取了一条指令。该指令可以被限制为“继续”:这种想法是直到被告知继续执行之前,它实际上并没有继续。)

    暂停时,您手动输入包含树的临时目录并对其进行修复。准备就绪后,您将“ continue”指令发送到命名管道,然后树过滤器将控制权返回到filter-branch,然后继续进行过滤。

第二种方法意味着您不必保存和加载筛选器分支状态-现有的git filter-branch代码照常运行;似乎以某种方式,它运行的树过滤器有时是如此之慢,以至于花费分钟而不是几秒钟。

答案 1 :(得分:0)

  

然后我如何在不影响git责备的情况下进行提交

您可以得到相当不错的成绩,我认为补偿手部的修改是不值得的,但忽略自动重新格式化的更改很容易:git blame将您指定的任何文本转换应用于文件内容,因此请告诉它在检查结果是否应归咎于更改之前,以自动模式在您的lint上运行预通过。

这是一个测试用例,其中“样式短毛绒”仅将“ REFORMATTED”添加为第二行的第一个单词。并通过运行git的幂等式来指导git认为这不值得。

cd进入回收站目录,并将其复制到文件temp内,

find ! -name temp -delete; git init
doit() { eval "$@"; shift $(($#-1)); git add .; git commit -m "$*"; }
(
doit '>file'
doit echo '>>file' line1
doit echo '>>file' line2
doit '>B'
doit sed -i "'s/line2/REFORMATTED line2/'" file '#' 'REFORMATTED line2'
doit echo '>>file' line3
) >/dev/null

set -x
git log --oneline --graph --decorate

git blame file

git config diff.REF.textconv 'awk '\''NR==2 && $1!="REFORMATTED" {$1="REFORMATTED "$1 }1'\'
mkdir .git/info
echo file diff=REF >.git/info/attributes

git blame file

然后执行sh temp。您的元数据将更改“导致时间戳和ID,但是否则您应该看到

$ sh temp
Initialized empty Git repository in /home/jthill/src/snips/test/.git/
+ git log --oneline --graph --decorate
* 282c142 (HEAD -> master) line3
* ee58923 REFORMATTED line2
* d8558d2 >B
* 6801a1d line2
* 030e551 line1
* f912c83 >file
+ git blame file
030e5517 (jthill 2019-02-23 18:41:36 -0800 1) line1
ee589239 (jthill 2019-02-23 18:41:36 -0800 2) REFORMATTED line2
282c142d (jthill 2019-02-23 18:41:36 -0800 3) line3
+ git config diff.REF.textconv 'awk '\''NR==2 && $1!="REFORMATTED" {$1="REFORMATTED "$1 }1'\'''
+ mkdir .git/info
+ echo file diff=REF
+ git blame file
030e5517 (jthill 2019-02-23 18:41:36 -0800 1) line1
6801a1d6 (jthill 2019-02-23 18:41:36 -0800 2) REFORMATTED line2
282c142d (jthill 2019-02-23 18:41:36 -0800 3) line3

...尤其要注意第二行的责任变化。