command-line - 已有未提交的更改时,如何使用hg命令行应用多个补丁?

标签 command-line mercurial versioning patch

我使用以下命令在Mercurial中应用补丁,而无需提交:

hg import patch.diff --no-commit

效果很好,但是,如果我尝试一次应用多个补丁,如下所示:
hg import patch1.diff --no-commit
hg import patch2.diff --no-commit
...

我在第二次提交后收到此错误消息:
abort: uncommitted changes

如果我在SourceTree中做完全相同的操作(先应用patch1,然后应用patch2,然后选择“修改工作副本文件”),则可以:将两个补丁应用于工作副本,将patch1和patch2的更改组合/折叠在一起。

如何使用hg命令行执行相同的操作?

最佳答案

这是由Mercurial作者设计的行为:假设您在工作副本中“手动进行了”未提交的更改,我们不希望hg import自动应用补丁,并且错误地提交更改和补丁更改日志消息和两个更改纠缠在一起。

这就是hg help import说:

Because import first applies changes to the working directory, import will
abort if there are outstanding changes.

import命令更多的是用于导入变更集(当数据来自hg export时使用metedata),而不仅仅是应用补丁。如果您在工作副本中有自己的更改,则可以例如使用hg import --bypass,并且在那里不会发生错误,因为提交是直接应用于存储库而不是工作副本。 (注意:但是,如果您只是提交更改,则会得到两个标题,需要合并.. :-)。

对于Unix系统,使用命令行的解决方案是直接使用patch命令而不是hg import,因为这样就不会对本地修改进行检查。例如。,
for i in 1 2 etc.
do 
   patch -p1 < patch$i.diff
done
hg commit ...

对于非Unix系统,您还可以通过安装shelve扩展名,在全局配置文件(mercurial.ini)中启用扩展名,然后使用shelve处理合并后的一个补丁,来获得一个纯粹的Mercurial解决方案:
hg import --no-commit patch1.diff
hg shelve
hg import --no-commit patch2.diff
hg unshelve
etc.

如果发生冲突,shelve将检测到它,您必须解决它,然后通过shelve选项告诉--continue它已解决。

希望能对您有所帮助。

关于command-line - 已有未提交的更改时,如何使用hg命令行应用多个补丁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26544681/

相关文章:

mercurial - 使用 TortoiseHG 强制版本号

java - 如何将命令行参数作为密码传递给gradle项目?

windows - 设置环境变量窗口

linux - Bash 引号禁止转义

php - 从命令行执行获取 Apache Document Root(无浏览器)

mercurial - hg log 可以只显示给定版本的祖先吗?

mercurial - 如何让 Mercurial 将 "hg out --patch"diff 显示为视觉差异?

database - 网络应用程序 : Keeping trace of the version of the application in database?

mercurial - 在 TortoiseHGs block 选择中只选择一行进行提交

ios - App Store 版本使用错误的核心数据版本