文件丢失在git中

时间:2016-03-04 22:32:35

标签: git

我的开发团队最近从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)我已在本地检查了分支'开发'(星号)

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

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/

仅查看涉及给定目录的提交(即使路径不再存在)