Mercurial/hg:在特定修订版(不更新到该修订版)搜索文件(按文件名)
Mercurial/hg: search for a file (by filename) at a specific revision (without updating to that revision)
我需要一个特定版本的文件。我有我感兴趣的修订的变更集 ID。此外,我还有没有路径的全小写文件名((我希望)文件名在存储库中是唯一的):example.cpp。现在我想找到文件的完整路径。然后我会使用 hg cat -r #REV /path/to/Example.cpp
.
的路径
困难可能在于文件同时被重命名或删除。但是我需要特定时间点和特定分支的文件(由变更集 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/。我们的崩溃转储分析器知道崩溃的版本的变更集 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,也许我在这里没有看到明显的解决方案...)。
您可以使用 hg manifest -r REV 获取该版本中所有文件的列表。然后您可以在该列表中搜索您的文件。
基于 Joeri van Ruth 的回答的完整解决方案。
列出指定版本的所有文件:
hg manifest -r 3b62b0e7edcb48e34ca08bed31c6cd1d00df93c2
然后搜索 example.cpp 文件并提取整个路径(例如使用 grep)...然后获取文件内容:
hg cat -r 3b62b0e7edcb48e34ca08bed31c6cd1d00df93c2 "Folder/Sub/Example.cpp"
我需要一个特定版本的文件。我有我感兴趣的修订的变更集 ID。此外,我还有没有路径的全小写文件名((我希望)文件名在存储库中是唯一的):example.cpp。现在我想找到文件的完整路径。然后我会使用 hg cat -r #REV /path/to/Example.cpp
.
困难可能在于文件同时被重命名或删除。但是我需要特定时间点和特定分支的文件(由变更集 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/。我们的崩溃转储分析器知道崩溃的版本的变更集 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,也许我在这里没有看到明显的解决方案...)。
您可以使用 hg manifest -r REV 获取该版本中所有文件的列表。然后您可以在该列表中搜索您的文件。
基于 Joeri van Ruth 的回答的完整解决方案。
列出指定版本的所有文件:
hg manifest -r 3b62b0e7edcb48e34ca08bed31c6cd1d00df93c2
然后搜索 example.cpp 文件并提取整个路径(例如使用 grep)...然后获取文件内容:
hg cat -r 3b62b0e7edcb48e34ca08bed31c6cd1d00df93c2 "Folder/Sub/Example.cpp"