如果已经有未提交的更改,如何使用hg命令行应用多个补丁?

tig*_*rou 16 versioning mercurial command-line patch

我使用以下命令来应用补丁Mercurial,而不提交它:

hg import patch.diff --no-commit
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但是如果我尝试一次应用几个补丁:

hg import patch1.diff --no-commit
hg import patch2.diff --no-commit
...
Run Code Online (Sandbox Code Playgroud)

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

abort: uncommitted changes
Run Code Online (Sandbox Code Playgroud)

如果我完全相同SourceTree(应用patch1然后patch2并选择"修改工作副本文件")它可以工作:两个补丁应用于工作副本,patch1和patch2的变化组合/折叠在一起.

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

Chr*_*ler 14

这是由Mercurial作者设计的行为:假设您在工作副本中"手动进行"未提交的更改,我们不希望hg import自动应用修补程序,并使用错误的日志提交更改和修补程序更改消息和两个变化纠缠在一起.

这就是为什么hg help import说:

Because import first applies changes to the working directory, import will
abort if there are outstanding changes.
Run Code Online (Sandbox Code Playgroud)

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

使用Unix系统命令行的解决方案是patch直接使用命令,而不是hg import因为那时不会检查本地修改.例如,

for i in 1 2 etc.
do 
   patch -p1 < patch$i.diff
done
hg commit ...
Run Code Online (Sandbox Code Playgroud)

对于非Unix系统,您还可以通过安装shelve扩展来获得纯Mercurial解决方案,在全局配置文件(mercurial.ini)中启用它,然后使用shelve一个补丁来处理另一个补丁:

hg import --no-commit patch1.diff
hg shelve
hg import --no-commit patch2.diff
hg unshelve
etc.
Run Code Online (Sandbox Code Playgroud)

如果发生冲突,shelve将检测到它,你必须解决它,然后告诉shelve它是用--continue选项解决的.

希望它会有所帮助.


tig*_*rou 5

这是对我有用的(Windows解决方案),想法是从Christophe Muller的答案中获得的:

copy /b "patch01.diff" + "patch02.diff" + ... + "patchXX.diff" "all.diff"

hg import "all.diff" --no-commit
Run Code Online (Sandbox Code Playgroud)

它只是将所有补丁串联在一起(作为一个大文件),然后应用它。