确定git repostiory中文件版本的最接近标记

时间:2017-02-16 16:03:49

标签: git

我有一个文件存储库和一个我知道来自它的文件,但我不确定在哪个标签/分支。我知道存储库中的文件名。

有没有一种简单的方法来搜索git树以找到文件来自的最近的分支/标记?

编辑:解释原因的完整场景。

我们有一个模板库。这些模板有时被另一个程序使用,当它们被使用时,它们从主模板存储库中检出,没有任何git历史记录。

快进到现在,我们希望能够以编程方式使用这些模板更新所有位置,但对于其中许多模板,我们不知道实际使用的是哪个版本,以及可能必须在哪些版本中进行更新。其余代码允许无缝更新。所以我们要做的是弄清楚特定模板的特定版本最接近的标签(a-la git describe)。从那里,我们可以根据需要安排其余的更新。

所以我有一个模板的副本,我知道它来自我的回购,但我不知道它何时来自。

2 个答案:

答案 0 :(得分:1)

好的,所以你有一些内容,并且你想在历史中的哪个位置找到内容出现在回购邮件的给定路径上。

你提到了关于MD5的一些事情;也许你的意思是git使用的哈希(实际上是一个SHA1),但即使你没有使用git的哈希也是如此。请注意,您不能仅使用任何实用程序来计算SHA1,因为git会在内容中附加标头,并且在计算哈希值之前也可能会应用一些过滤器。所以:

git hash-object file-containing-the-target-content

并记下它给你的SHA1。

接下来,您需要包含文件sha1的日志输出。一种方法是

git log --raw --no-abbrev --all --full-history --reverse -- path/to/file/in/repo

并在输出中搜索上面找到的第一次出现的sha1值。 (可能有一种方法可以自动搜索内容;我正在考虑那个但是由于某种原因它没有点击。但只是捕获日志或将其管道更少,然后搜索sha1值,将无需工作太麻烦了。)

也许这正是你需要做的......但说实话,我想不出这种技术的应用是什么。如果您想知道某个特定内容何时进入回购,那么使用git blame可能会更有成效。

答案 1 :(得分:0)

我要单独发布这个,因为@ mark-adelsberger让我大部分都在那里,但是并没有一次性完成。以下是如何根据文件的内容定位文件的提交,并获取最接近的标记:

hash=$(git hash-object file_of_unknown_origin)
commit_hash=$(git log --raw --no-abbrev --all --full-history --reverse --format=format:%H -- path/to/file | sed 's/^:[0-9]* [0-9]* [a-z0-9]* //' | grep -B1 $hash | head -n 1)
git checkout $commit_hash
git describe --tags
相关问题