我可以稍后在 Mercurial 中修复不正确的文件移动吗?

Chr*_*ips 5 mercurial rename

我们都有过这样的经历——您使用 Mercurialhg move命令以外的其他东西移动文件,然后提交并推送您的更改,但后来才意识到您的错误。有没有什么方法可以在以后通知 Mercurial,“旧”路径和“新”路径之间存在关系?

我试过玩,--after但似乎只是出错了,除非您在提交问题变更集之前碰巧发现了问题:

  > hg move OLD_PATH NEW_PATH --after
  OLD_PATH: The system cannot find the file specified
  abort: no files to copy
Run Code Online (Sandbox Code Playgroud)

在我的特殊情况下,此更改是由同事在一个(或两个)杂乱的私有分支上提交的,然后合并到我们的default分支并推送到我们的主存储库,因此它已经传播到整个团队。

有任何想法吗?

Rei*_*nds 5

首先,您确定没有检测到重命名吗?默认情况下,Mercurial 将检测文件保持不变的移动(即不是重命名+编辑的位置)并将其记录为重命名。验证它实际上没有被检测到hg log -f NEW_PATH

如果它没有被记录为重命名,请使用正确的重命名和合并从旧提交中创建一个分支:

hg update -r ORIGINAL_COMMIT    # Go to the commit before the rename
hg move OLD_PATH NEW_PATH       # Record the rename
hg commit                       # Commit the rename
hg update default               # or whatever your main branch is
hg merge -r tip --tool :other   # '-r tip' is technically optional
hg commit                       # Commit the rename to the main branch
hg log -f NEW_PATH              # Verify that it worked
Run Code Online (Sandbox Code Playgroud)

请注意,这--tool :other将优先考虑“其他”分支(即新提交)并从那里学习正确的历史记录。


后记:也可以事后更改历史,但为此您需要进化扩展。有了它,您可以在事后更改提交(使用hg amendhg commit --amend)并通过您的历史记录(使用hg evolve --all)[1]传播更改。但是,您团队的其他成员可能也需要进化扩展;此外,需要为其设置推送到/拉出的共享存储库(作为非发布存储库)。虽然这是可能的,但设置工作和您的团队可能需要精通的培训可能不值得;此外,其他与 Mercurial 相关的工具可能无法理解它并被它混淆。简而言之:这是目前一个高级选项,只有在完全理解并且替代方案不足的情况下才能使用。

[1] 请注意,这hg evolve实际上不会修改历史,而是创建一个新的替代历史,通过所谓的过时标记与原始历史相关。可以使用hg log --hidden(或其他带有--hidden标志的命令)查看旧历史记录。