首先让我说我已经搜索到了高低,但没有找到一个好的答案。
如果我的更改只是将标签转换为空格,或运行自动完成所有操作的脚本,那么这个可以工作:git: change styling (whitespace) without changing ownership/blame?
我想运行一个任意的交互式清理,比如运行样式linter然后采取人工步骤来解决问题,我如何在不影响git责任的情况下进行提交?我看到有--reset-author,但事实证明,将一切都重置给那个提交的作者,而不是这种情况需要什么。
您仍然可以使用链接问题中概述的一般概念,但您将无法使用git filter-branch
来运行它。好吧,不是直接的。研究the filter-branch script以了解它如何设置它所做的每个新提交,以便保留作者和提交者名称,电子邮件地址和时间戳,并查看它如何运行树过滤器。
无论如何,你必须自己编写一些不完全琐碎的代码,运行你的风格linter,然后获得所需的帮助。我看到两个明显的路径:
--tree-filter
(这将是使用者)期间,如果遇到需要人工帮助的情况,它会暂停。 (也许你的树过滤器在这一点上读取来自命名管道的指令。指令可以仅限于'继续':这个想法是它实际上不会继续,直到被告知继续。)
暂停时,您手动输入包含树的临时目录并进行修复。当它准备就绪时,你将“继续”指令发送到命名管道,然后你的树形过滤器将控制返回到filter-branch,它继续进行过滤。第二种方法意味着您不必保存和加载过滤器分支状态 - 现有的git filter-branch
代码按原样工作;它似乎不知何故,它运行的树过滤器有时是如此慢,以至于需要几分钟而不是几秒钟。
如何在不影响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行的责任变化。