Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 提交重写而不使用交互重基?_Git - Fatal编程技术网

Git 提交重写而不使用交互重基?

Git 提交重写而不使用交互重基?,git,Git,是否可以在不使用交互模式的情况下运行提交(由哈希标识)的自动重写?我的目标是一个用于重写的一行程序,因为我需要从代码中调用 更新: 我对它做了一些修改,以供内联使用 git过滤器分支--msg过滤器“ruby-e”puts(ENV['git\u COMMIT']='1ba2dd66581f6fbc03d1a6406aed61b6473c9ab'?'new msg':STDIN.read)\'HEAD 使用纯bash(不使用ruby)会很好,但是我在让STDIN正常工作(使用read)方面遇到了麻

是否可以在不使用交互模式的情况下运行提交(由哈希标识)的自动重写?我的目标是一个用于重写的一行程序,因为我需要从代码中调用

更新:

我对它做了一些修改,以供内联使用

git过滤器分支--msg过滤器“ruby-e”puts(ENV['git\u COMMIT']='1ba2dd66581f6fbc03d1a6406aed61b6473c9ab'?'new msg':STDIN.read)\'HEAD

使用纯bash(不使用ruby)会很好,但是我在让STDIN正常工作(使用read)方面遇到了麻烦。

可以做你想做的事情。具体来说,您需要
--msg filter
参数:

这是用于重写提交消息的筛选器。参数在shell中使用标准输入上的原始提交消息进行计算;其标准输出用作新提交消息

一个缺点是,
git filter branch
希望在分支中的每个提交上运行,而您只希望重写一个提交(然后有效地重新设置其余提交的基础)。因此,您的消息过滤器需要有一些条件逻辑,以输出新的提交注释(对于您确实要重写的提交),或原始的未修改的提交消息(对于其他所有内容)

这就是诀窍:

git filter-branch --msg-filter "ruby /path/to/filter.rb 843c2da5e07de914ea2319fa3295730ff8b3b0a1 'New message'" HEAD
git filter branch
在调用脚本之前更改当前目录,因此您确实需要完全限定
/path/to/filter.rb

下面是
filter.rb

if ENV['GIT_COMMIT'] == ARGV[0]
  puts ARGV[1]
else
  puts STDIN.read
end

这可能可以在shell脚本中更简洁地重写,甚至不需要将消息过滤器脚本放在单独的文件中;但我是在Windows上运行的,所以我没有那么喜欢的东西。我有Ruby,所以我使用了它,它确实可以工作。

您可以重置为提交,进行修改以更改提交注释,然后从原始分支中选择它后面的每个提交。但似乎有比这更简单的方法。它看起来很有用,特别是
--msg filter
选项。但是我很难知道如何告诉它要重写哪个commit。如果你在纯bash中尝试这样做,我不知道如何执行条件逻辑,但是对于“If”情况,你可以使用
echo
,对于“else”情况,你可以使用
cat-
将STDIN复制到STDOUT。太棒了!但是请注意,哈希代码的语义在这里稍有改变:
git
通常会抱怨哈希代码不明确;您的代码似乎正在为一个不明确的哈希代码更改所有提交。没问题,只是要记住一点:安全总比抱歉好。@alf,我甚至没有想到两个提交有相同的7字符十六进制前缀——你完全正确,在这种情况下,这会产生不希望的效果。为了安全起见,我修改了我的代码以要求完整的散列。如果OP以编程方式调用此函数,那么完整的哈希值可能仍然可用。