【发布时间】:2020-05-31 00:11:32
【问题描述】:
我第一次尝试使用git filter-branch 重写我的 git 历史记录。我通过编写一个(Python)脚本(我们称之为edit_file)来编辑文件(我们称之为target_file)来做到这一点。然后,我运行了这个命令:
git filter-branch --tree-filter "path/to/edit_file" HEAD
我得到了一个不错的输出流,这似乎表明我得到了我想要的效果,但是当查看target_file 时,我没有看到任何变化。当我直接运行edit_file 时,我的工作副本中的target_file 成功接收到我想要的编辑。
它听起来我的改变存在于 git 扭曲的头脑中的某个深沉、黑暗和潮湿的隐蔽处,我只需要一个神奇的咒语来召唤我的改变。我不知道这是否正确,也不知道从哪里开始寻找,因为我读过的所有材料(包括官方 git 书)都表明,一旦 git filter-branch 完成,我正在处理的分支应该拥有edit_file 将在target_file 的每个版本上执行的更改...
停下来?
对不起,如果这有点啰嗦,但我不知道需要哪些细节(因为这是混淆的核心特征)。
更多细节:
我说它看起来像 filter-branch 的原因是:
我可以看到每次提交时都运行 edit_file 的输出,这表明所有提交都成功了。
edit_file的输出会随着它在target_file的不同版本上运行而发生变化,并且我能够看到edit_file的不同输出,因为git filter-branch在历史中移动。-
最后,我看到了这个:
Ref 'refs/heads/my-branch' was rewritten
PS:在做 git filter-branch 之前,我跑了
git checkout -b my-branch
创建一个名为 my-branch 的新分支(并检查一下),以防 git filter-branch 出现严重错误。
在看到git filter-branch ... 没有改变target_file 之后,我跑了git checkout -b my-branch,但我想那什么也没做。我认为它可能会有所作为,因为git filter-branch 的最后一行似乎是说分支my-branch 已更改,但老实说我不明白那行的意思。
【问题讨论】:
-
git show会告诉你这个文件现在在任何给定的提交中的样子。 -
@matt git show my_file 产生零输出。我假设通过添加更多标志,可以实现您提到的行为,但对我来说,这些行为是什么并不明显。你能发布一个完整的工作命令吗?
-
好吧,我说的是“在任何给定的提交中”。你没有提交。你选择查看什么提交?
-
我期望做的是向我展示每个提交,因为这将让我看到“这个文件现在在任何提交中的样子”。所以,你的问题的答案基本上是“是”。
-
是的,但我说的是任何 given 提交。也许我们在这里说的不是同一种语言。我要告诉你的是:如果你想知道文件在特定提交中的状态,
git show有权告诉你。因此,如果问题是:我是否根据需要转换了我的文件?git show将回答这个问题。您可以命名一个提交范围,但同样,为了告诉您实际的命令,我需要知道您在该范围端点处提交的名称。
标签: git git-filter-branch