2012-10-26 49 views
4

我已經將我的IDE設置爲每次保存任何內容時在本地提交。理想情況下,我最好喜歡保存未經審查的關於他們可能有用的罕見場合的記錄。但大部分時間,它使我的歷史方式詳細。怎麼辦,而不是在Mercurial中壓扁提交

我想知道一個很好的策略來保持歷史,但能夠在大多數時間忽略它。每次我保存時,我的IDE都在運行我自己的腳本,所以我可以控制它。

我是Mercurial的新手,所以我可能需要一個基本的答案。但是當提交,合併和報告能夠大多忽略這些自動提交時,我應該做的所有步驟是什麼,但是沒有實際壓縮它們?或者,我最好放棄,只是壓扁?

Related question about how to squash with highly rated comment suggesting it might be better to keep that history

編輯 - 在這裏我想說的是,如果水銀要保留所有的歷史記錄(我同意),它應該讓你篩選歷史以避免看到你也許會壁球的東西。我寧願而不是壓扁,我只是在一個策略中尋求幫助(在正常使用中,儘管不是總是),使它看起來儘可能多,就像我壓扁我的歷史一樣。

+0

@ Ry4an - 這是您在相關問題中提出的建議保留歷史記錄的評論,所以如果您想回答的話,我正在給您發送警報。 – psr

+1

我不認爲你可以ping你還沒有發佈的人。 – Laf

+1

爲什麼你想在保存時自動提交?不會導致非編譯提交?如果是這樣的話,那麼如果你有這個需求,那麼'hg bisect'很難使用。 –

回答

4

您想在回購協議中保留詳細的歷史記錄,但您希望擁有(並能夠導出)僅包含「合理」回報的理想歷史記錄,對嗎?我可以同情。

解決方案1:使用標記標記歷史中有趣的點,並學會忽略它們之間的所有雜亂的位。

解決方案2:使用兩個分支併合並。在分支default中進行開發,並保持並行分支release。 (你可以稱它爲clean,但實際上你正在管理版本)。每當default處於穩定狀態時您想要檢查點,切換到分支release合併到到它的當前狀態default - 批量,如果您願意。如果您從未直接向release提交任何內容,則永不會發生合併衝突。

(original branch) --o--o--o--o--o--o--o (default) 
      \    \  \ 
      r ... ... --r--------r  (release) 

結果:您可以更新到release任何修訂,並期望一個正常運作的狀態。你可以運行hg log -r release,你只會看到選定的檢查點。你可以檢查完整的日誌,看看事情是如何發生的。缺點:因爲release分支取決於default,所以如果不帶上default就不能將其推送到其他回購站。由於重複的合併,hg glog -r release也會顯得很奇怪。

解決方案3:使用如上所述的命名分支,但使用rebase擴展名而不是合併。它可以選擇複製而不是直接移動重新發布的變更集;它有一個選項--collapse,可以將一組修訂轉換爲一個修訂。只要你有一組修訂版r1:tip要終結,default複製他們release如下:

hg rebase --source r1 --dest release --keep --collapse 

這推動在release頭一個版本,即相當於從R1到整個變更default的負責人。 --keep選項使其成爲副本,而不是破壞性重寫。優點是release分支看起來就像你想要的那樣:漂亮乾淨,你可以在不拖動默認分支的情況下推送它。缺點是你不能把它的階段與default中的修改聯繫起來,所以我會推薦方法2,除非你真的來隱藏中間修訂。 (另外:分批擠壓你的歷史並不容易,因爲rebase會移動/複製「源」版本的所有後代)。

所有這些都需要你做一些額外的工作。這是不可避免的,因爲mercurial沒有辦法知道你想擠壓哪個版本。

2

如果你真的不想要保持從每一個Ctrl-S所有的微小變化的回購歷史,只有log顯示重要的子集,你總是可以tag的「重要」的變更,然後別名loglog -r tagged()。或者,您可以使用與其他一些revset descriptor相同的原則,例如在自動提交的消息中包含文本「autosave」,並使用log -r keyword(autosave),這會向您顯示所有非自動保存的提交。


爲了實現自己的目標,至少我想接近它,我會用mq extension和自動提交每個保存補丁隊列庫。然後,當你完成你的「白癡摸索」時,你可以將修補程序作爲一個可以推送的單個變更組。您應該(一如既往!)將更改保持在一個概念或步驟的中心位置(例如「修復保存按鈕」),但是這將捕獲所有將您帶到那裏的小步驟。

你需要

  • hg qinit --mq一次initialze補丁隊列回購(FYI:存放在\.hg\patches\
  • hg qnew fixing-the-save-btn創建一個補丁

然後每次你在節省時間的IDE

  • hg qrefresh更新補丁
  • hg commit --mq使小變更的補丁隊列回購

,當你完成

  • hg qfinish fixing-the-save-btn補丁轉換成被推
一個變更

這樣可以使您的回購本地保存在您的回購庫中,並且每次保存時都會更改,但只有在完成時才推送更改集。您也可以qpopqpush更改您正在處理的項目。

如果您嘗試使用壓扁方法,那麼當您將變更集壓扁時,您會失去摸索的歷史記錄。無論是這樣,還是你都會試圖將工作遷移到「真正」存儲庫,或者從「真實」存儲庫遷移工作,我可以從經驗告訴你,你不想這樣做。 :)

+0

謝謝,但我實際上是在試圖*不*避免污染歷史。我只是想以一種不會讓我在大多數時候看到歷史的方式來使用Mercurial。 – psr

+0

這種(壞)的方式,你會得到巨大的,非原子的補丁,它可以結合單獨的**無關的邏輯**任務。我認爲,它比最短的提交列表更糟糕(這兩種類型都需要以後重組) –

+0

自動提交到修補程序隊列存儲庫需要'qnew'或'qrefresh'在'hg commit --mq'之前做任何事情。 –

3

它應該讓你篩選歷史以避免看到你可能會壁球

水銀對這個工具的東西。如果你只是不想看到(在hg log,我想) - 與revsets過濾這些變更:

hg log -r "not desc('autosave')" 

或者,如果你使用TortoiseHg,只是去查看 - >過濾器工具欄,並鍵入「不遞減( '自動保存')「」。 Voila,您的自動保存條目從主列表中隱藏。

1

我建議你使用分支機構。當你開始一個新功能時,你創建一個新的分支。您可以在該分支中儘可能多地並且經常地進行提交。完成後,將功能分支合併到您的主幹中。這樣,你基本上將歷史分爲兩類:一類屬於細粒(特徵分支中的歷史),另一類屬於粗粒(歷史中的軀幹)。您可以使用以下命令輕鬆查看其中的一個:hg log --branch <branch-name>