2010-11-26 50 views
8

場景:我已經「繼承」的程序,保持水銀下,只有我的工作與特定的調整,以某些文件,這些文件在籤系統上我要籤這些調整可以Mercurial做反向修補嗎?

。我最近的解決方案是創建一個包含這些調整的mercurial補丁文件(hg diff> patchfile);當我需要檢查更改時,我只需反向應用修補程序,提交併重新應用修補程序。 (如果我完全控制了源代碼,我只是將所有這些小小的調整移動到一個不受版本控制的配置文件中,將「示例」配置文件置於版本控制之下)

不幸的是,似乎雖然GNU patch命令支持--reverse標誌,但它不支持hg的多文件比較格式作爲單個補丁文件(或者它可以,我只是不知道它的開關?)。 OTOH,hg有自己的patch命令,可以應用diff,但不支持任何種類的reverse標誌。

所以我的問題是雙重的:

  1. 如何應該這將在水銀做了什麼?當然掛在「調整補丁」並不是處理這種情況的唯一方法。也許mercurial有一個插件或內置的這種暫時的,不可改變的變化。
  2. 除了應該怎麼做,有什麼辦法可以將這樣一個mercurial diff-patch應用到這樣的mercurial repo嗎?還有其他情況下,這些功能將是有用的。

回答

19

Mercurial的patch命令(真的是import)不支持反轉,但hg diff呢。對此使用--reverse,您將得到一個Mercurial可以應用的反向修補程序。

然而,你所描述的是一個非常命令供應商分支風格的工作流程,mercurial可以更好地支持使用diff和patch之外的其他功能。

特別地,Mercurial Queues完全符合你的要求。

+0

這接近我想要的(我必須承認,我從來沒有把學習MQ努力到現在爲止)。然而,現在我已經將我的補丁添加到mq中並且做出了我想提交的更改,「hg ci」抱怨說我「無法承諾應用的mq補丁」。在提交之前,我不能'補丁'補丁,因爲補丁中有本地更改。這似乎是一個阻礙MQ解決問題的障礙,除非我錯過了一些東西。 – eternicode 2010-11-26 22:58:41

1

我發現 - 當您有子回購時,反向方法不起作用。即

hg diff --reverse -S 

。如果它可以幫助任何人,這才勉強測試腳本似乎做的工作:

#!/bin/bash 

DIRS="$*" 

if [[ $DIRS = "" ]]; then 
    DIRS=$(echo *) 
fi 

for arg in $DIRS; do 
    arg=$(echo $arg | sed 's/^\.\/*//g') 
    repo=$(echo $arg | cut -d'/' -f-1) 

    grep -q "^$repo = " .hgsub 2>/dev/null 
    if [ $? -eq 0 ]; then 
     if [ -d $repo ]; then 
      cd $repo 
      hg diff --reverse | sed -e "s;--- a;--- a/$repo;g" -e "s;+++ b;--- b/$repo;g" 
      cd .. 
     else 
      echo Error, unknown repo $repo 
     fi 
    else 
     hg diff $arg --reverse 
    fi 
done 
相關問題