2011-02-08 75 views
4

我在Mercurial版本控制下有一個CakePHP項目。目前app/tmp目錄中的所有文件都在進行版本控制,這些版本一直在變化。Mercurial,停止版本緩存目錄但保留目錄

我不想對這些文件進行版本控制。

我知道我可以通過運行hg forget app/tmp/*

停止但這也不會忘記的文件結構。我想保留的。現在我知道Mercurial不是版本目錄,只是文件,但CakePHP人員也很聰明,可以在每個空目錄中放置一個名爲empty的空文件(我爲此猜測)。

所以我想要做的是告訴Mercurial忘記app/tmp下的所有文件,除了名稱正好是空的文件

這個命令會是什麼?

回答

3

好吧,如果沒有別的辦法,你總是可以只問水銀忘記一切,然後提交之前恢復empty

以下是我轉載的,首先創建初始回購:

hg init 
md app 
md app\tmp 
echo a>app\empty 
echo a>app\tmp\empty 
hg commit -m "initial" -A 

然後加入我們以後要擺脫一些文件:

echo a >app\tmp\test1.txt 
echo a >app\tmp\test2.txt 
hg commit -m "adding" -A 

然後忘記了文件,我們不希望:

hg forget app\tmp\* 
hg status      <-- will show all 3 files 
hg revert app\tmp\empty 
hg status      <-- now empty is gone 
echo glob:app/tmp>.hgignore 
hg commit -m "ignored" -A 

注意,所有.hgignore做是爲了防止從發現新文件水銀期間addremovecommit -A,如果你已經明確地追蹤符合您忽略過濾器的文件,水銀仍然會跟蹤更改這些文件。

換句話說,即使我要求Mercurial忽略上面的app/tmpempty裏面的文件也不會被忽略或刪除,因爲我已明確要求Mercurial跟蹤它。

3

至少在理論上(我現在沒有時間去嘗試),​​應該與hg forget命令一起使用。因此,您可以在目錄中執行類似hg forget -X empty的操作(-X表示「排除」)。

當然你可能要考慮使用.hgignore。

+0

只是增加他們在.hgignore應該做他想做什麼。你只需要小心地運行一個後續的`hg purge`(我知道那個很難過,不幸) – 2011-02-08 15:03:31

+0

我會試試看。對於.hgignore,我只需在其中放入「app/tmp」?謝謝 – 2011-02-08 15:06:41

+0

@Tim,如果我創建一個名爲.hgignore的文件,內容爲'app/tmp`,它會忽略該目錄嗎?我如何使用模式匹配來排除忽略中的`empty`文件,使目錄保持版本化?謝謝!! – 2011-02-08 15:09:09

2

既然你只需要做一次我只是這樣做:

find app/tmp -type f | grep -v empty | xargs hg forget 
hg commit 

從此只是把這個在你的`.hgignore」

^app/tmp 
0

水銀內置了支持globbing和正則表達式,正如在mercurial book的relevant chapter中所解釋的。使用python regex實現。

這應該爲你工作:

hg forget "re:app/tmp/.*(?<!/empty)$"