我的开发团队最近从SVN切换到Git,我遇到了一些问题,例如:
我正在寻找一个定义包“com.acme.service.filter”的Java文件(因为maven说包不存在)。快速查找告诉我maven是对的:
$ find . -name '*.java' -exec grep -Hn 'package.*com.acme.service.filter' '{}' \;
$
所以我想知道在哪个分支中我可以找到这样一个文件,经过一些阅读后我求助于:
$ git grep 'package.*com.acme.service.filter' $(git rev-list --all)
经过一段时间后才真正发现了几个问题:
f1b183d1cc1ee43a16621a812ff0c924f4aa45d7:xxxxxxx/src/main/java/com/acme/service/filter/SomeFilter.java:package com.acme.service.filter;
和其他仅在哈希中有所不同。
git命令
$ git branch -a --contains f1b183d1cc1ee43a16621a812ff0c924f4aa45d7
* development
remotes/origin/development
告诉我
1)该文件包含在本地分支“development”和远程分支“origin / development”中 2)我已在本地检查了分支'开发'(星号)
那为什么我找不到文件呢?有人能告诉我我错过了什么吗?
答案 0 :(得分:3)
你从git grep '<pattern>' $(git rev-list --all)
得到的哈希很重要。它们不是找到的文件的校验和。它们是指定文件与您的模式匹配的提交的ID。
然后使用这样的提交ID作为git branch -a --contains
的参数。来自git branch
documentation(强调我的):
[
--contains <commit>
]仅显示包含命名提交的分支(换句话说,提示提交为指定提交的后代的分支)。
所以你得到的是在他们的历史中提交f1b183d1cc1ee43a16621a812ff0c924f4aa45d7
的分支。这并不意味着他们的提示中包含所有f1b183d1cc1ee43a16621a812ff0c924f4aa45d7
个文件。 (分支&#34;提示&#34;是它的#34;最后&#34;提交:那个没有自己的后代的那个。)
如果您想使用f1b183d1cc1ee43a16621a812ff0c924f4aa45d7
中的内容恢复中的文件,请尝试:
git checkout f1b183d1cc1ee43a16621a812ff0c924f4aa45d7 -- xxxxxxx/src/main/java/com/acme/service/filter/SomeFilter.java
这将恢复文件并将其添加到git的临时区域(a.k.a。&#34;索引&#34;)。
答案 1 :(得分:1)
matti可能是对的。
您可以执行以下操作:
git log -- src/main/java/com/acme/service/filter/
仅查看涉及给定目录的提交(即使路径不再存在)