2016-03-04 70 views
1

我的开发团队最近从SVN切换到Git,我有一些问题,如:文件丢在混帐

我在寻找定义包的Java文件“com.acme.service.filter “(因为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 branch -a --contains f1b183d1cc1ee43a16621a812ff0c924f4aa45d7 
* development 
    remotes/origin/development 

告诉我,

1)文件包含在当地的分支机构“发展”,并在远程分支“原产地/开发” 2)我已经确认在本地分支'发展'(星号)

那么为什么我不能找到该文件?有人能告诉我我错过了什么吗?

+2

也许在此之后的另一个提交已删除有问题的行或文件。 –

回答

1

matti可能是对的。

你可以这样做:

git log -- src/main/java/com/acme/service/filter/ 

只能看到涉及给定的目录(即使路径已不存在)

3

git grep '<pattern>' $(git rev-list --all)得到的哈希值是非常重要的提交。他们不是找到的文件的校验和。它们是指定文件与您的模式匹配的提交的ID。

然后,您使用这样一个提交ID作为参数git branch -a --contains。从git branch documentation(重点煤矿):

[--contains <commit>]仅示出了包含名为提交分支(换句话说,其尖端是提交的名为后代提交分支)。

所以你得到的是其历史上提交f1b183d1cc1ee43a16621a812ff0c924f4aa45d7的分支。这并不意味着他们的提示中包含了所有f1b183d1cc1ee43a16621a812ff0c924f4aa45d7的文件。 (分支的“小费”是其“最后”承诺:即没有任何自己的后代,然而一个。)

如果你想用它在f1b183d1cc1ee43a16621a812ff0c924f4aa45d7内容恢复文件中,请尝试:

git checkout f1b183d1cc1ee43a16621a812ff0c924f4aa45d7 -- xxxxxxx/src/main/java/com/acme/service/filter/SomeFilter.java 

这将重新生成文件并将其添加到git的暂存区域(又名“索引”)。