如何在不更改提交哈希的情况下更改git commit消息

maa*_*nus 17 git history

标题不准确,但我不能在一行中表达得更好.

  • 我实际上知道如何改变这里的 git commit消息.
  • 但是我知道它总是会改变SHA-1,我想避免它.

我只想看到一个不同的消息git-log.我认为它可以以某种方式使用git-notes,但我没有管理它.


说明:

我需要它来修复提交消息中的错误.我总是在那里写一个文件的名称,其中包含我与客户的沟通(看起来就像T1234 Replace foo by bar).通信往往很长,所以我可以花很多时间,直到我发现我在提交消息中被错误的文档名称误导.

用于 git-notes

git-notes事实上看起来像这里所说的那样有效.但是我总是使用

git log --oneline
Run Code Online (Sandbox Code Playgroud)

所以我从来没有看到它.关于关于向用户说谎的评论:恕我直言,当这种情况发生时,只有在使用特殊的开关时才会接受--replace-messages-by-notes,不是吗?因为我总是使用别名而不是git log直接使用,所以我会得到我想要的东西而不需要输入很多东西.

你认为这是一个合理的功能要求还是你会向我推荐另一个工作流程?

Von*_*onC 15

git notes"自我注释"一文中所述,是在不更改SHA1的情况下获得不同git日志消息(不同于提交消息)的唯一方法.

但有几点评论:

  • Notes由命名空间组织,默认值为"提交".
  • Notes 不会修改提交消息,它们只会添加它(这可能就是为什么git notes不适合你).
  • 默认情况下不会推送注释,除非您明确指定它们的refspec(refs/notes/*)


Mar*_*air 8

正如各种各样的人所指出的那样(例如在VonC非常有用的答案中),git notes实际上是你正在寻找的机制.是否仅将您的别名更改为以下内容是不够的?

git log --oneline --show-notes
Run Code Online (Sandbox Code Playgroud)

据推测,只是偶尔你必须在提交中添加一个注释,并且注释将在该命令的输出中直观地突出.

如果你真的想要替换每个提交的主题,如果存在注释,你总是可以创建一个脚本:

for c in $(git rev-list HEAD)
do
    n=$(git notes show $c 2> /dev/null)
    m=$(git show --oneline $c|head -1)
    if [ -n "$n" ]
    then
       m=${m/ */ $n}
    fi
    echo $m
done
Run Code Online (Sandbox Code Playgroud)

......但在我看来,这个收益微不足道.


Joh*_*lph 7

从技术上讲,这似乎是不可能的(至少对我来说,我不是git pro).

git commit存储树形哈希(想想:当时工作目录的状态)以及其他提交信息.当您更改提交消息时,树形哈希将不会更改,但提交哈希将更改,因为它是从提交对象计算的,没有办法解决它.

有关详细信息,请参阅Progit内部.