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

问题描述 投票:0回答:2

首先让我说我已经搜索到了高低,但没有找到一个好的答案。

如果我的更改只是将标签转换为空格,或运行自动完成所有操作的脚本,那么这个可以工作:git: change styling (whitespace) without changing ownership/blame?

我想运行一个任意的交互式清理,比如运行样式linter然后采取人工步骤来解决问题,我如何在不影响git责任的情况下进行提交?我看到有--reset-author,但事实证明,将一切都重置给那个提交的作者,而不是这种情况需要什么。

git static-analysis
2个回答
1
投票

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

无论如何,你必须自己编写一些不完全琐碎的代码,运行你的风格linter,然后获得所需的帮助。我看到两个明显的路径:

  • 重现filter-branch的逻辑,但是在多次运行中保存状态(例如,在文件中保存状态)。这样你就可以启动它,告诉它运行直到它需要交互,并让它在那一点终止。现在你可以修复并使用“continue”选项调用它,让它运行直到它再次需要帮助,然后再次停止。重复直到完成。
  • 编写或修改过滤器分支脚本,以便在您的--tree-filter(这将是使用者)期间,如果遇到需要人工帮助的情况,它会暂停。 (也许你的树过滤器在这一点上读取来自命名管道的指令。指令可以仅限于'继续':这个想法是它实际上不会继续,直到被告知继续。) 暂停时,您手动输入包含树的临时目录并进行修复。当它准备就绪时,你将“继续”指令发送到命名管道,然后你的树形过滤器将控制返回到filter-branch,它继续进行过滤。

第二种方法意味着您不必保存和加载过滤器分支状态 - 现有的git filter-branch代码按原样工作;它似乎不知何故,它运行的树过滤器有时是如此慢,以至于需要几分钟而不是几秒钟。


0
投票

如何在不影响git责任的情况下进行提交

您可以非常接近,我认为补偿手部修改不值得痛苦,但忽略自动重新格式化更改很容易:git blame将您指定的任何文本转换应用于文件内容,因此请告诉它运行在检查结果是否适用于更加严重的变化之前,您的linter处于全自动模式的预通过。

这是一个测试案例,其中“style linter”只是将“REFORMATTED”添加为第二行的第一个单词。并且git被指示通过运行(幂等版本)作为文本转换来认为它不是应受谴责的。

进入垃圾目录并将其复制到文件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

...特别注意第2行的责任变化。

© www.soinside.com 2019 - 2024. All rights reserved.