2017-05-08 80 views
2

我需要某個修訂版的一個文件。我有我感興趣的版本的變更集ID。此外,我有沒有路徑的全小寫文件名((我希望)文件名在存儲庫中是唯一的):example.cpp。現在我想找到文件的完整路徑。然後我會使用hg cat -r #REV /path/to/Example.cpp的路徑。Mercurial/hg:在特定修訂版中搜索文件(按文件名)(不更新到該修訂版)

問題可能在於,該文件在同一時間被重命名或刪除。但我需要特定時間點的文件和特定的分支(由變更集ID標識)。

我可以看到最簡單的方法就是更新到該版本並在本地工作目錄中搜索文件。但是這樣做太慢,無法在服務器上以批處理模式自動執行。我希望能找到像hg findfile 3b62b0e7edcb48e34ca08bed31c6cd1d00df93c2 -name --ignorecase example.cpp這樣的文件,它可以在指定的版本中找到我的文件(由變更集ID 3b62b0e7edcb48e34ca08bed31c6cd1d00df93c2標識)和該名稱(example.cpp)。理想情況下,我只會找到一個,然後可以使用hg cat來獲取文件的內容。

如果我可以在由該變更集ID標識的特定時間點打印整個文件樹,那麼這對我也有幫助。我很確定這是可能的,因爲webfrontend hgweg也允許以特定的變更集ID在線瀏覽該目錄。 (例如:https://www.mercurial-scm.org/repo/hg/file/de86a6872d06)。然後,我可以遞歸地對該文件進行不區分大小寫的搜索並對其執行hg cat

背景: 我目前正在擴展一個自動崩潰轉儲文件分析器。我們在我們的應用程序中使用http://crashrpt.sourceforge.net/。我們的崩潰轉儲分析器知道發生崩潰的版本的changeset-id。它現在通過從我們的調試符號目錄中獲取正確的調試符號(pdb)來自動分析崩潰轉儲。結果是調用堆棧顯示小寫的文件名(example.cpp),但不包含路徑。我只想獲取該文件的相應代碼。

在谷歌搜索期間,我發現Retrieve old version of a file without changing working copy parent這解決了我的一半問題。我還發現我以前不知道的hg grep,但是如果我正確理解它,hg grep -l example.cpp可以找到我的文件,但它不會告訴我這是否是我在感興趣的特定修訂中使用的路徑。因爲grep可能會得到錯誤的修訂或不同的分支。 (但正如我所說,今天是我第一次聽說hg grep,也許我在這裏看不到明顯的解決方案......)。

回答

2

您可以使用hg manifest -r REV來獲取該修訂中所有文件的列表。然後你可以在那個列表中搜索你的文件。

0

Complete Solution根據Joeri van Ruth的回答。

列表中指定修訂版的所有文件:

hg manifest -r 3b62b0e7edcb48e34ca08bed31c6cd1d00df93c2

然後搜索example.cpp文件和提取出完整的路徑(例如,通過用grep)...然後獲取這些文件的內容:

hg cat -r 3b62b0e7edcb48e34ca08bed31c6cd1d00df93c2 "Folder/Sub/Example.cpp"