【问题标题】:How to find out what commit a checked out file came from如何找出签出文件来自哪个提交
【发布时间】:2011-08-05 13:55:20
【问题描述】:

当我使用git checkout $commit $filename 签出文件时,我忘记了$commit,但仍记得$filename,我如何找出$commit 是什么?

【问题讨论】:

  • @jleedev 如果可以的话,我会接受它作为答案^^
  • 投票关闭作为 jleedev 链接的副本。只是想补充一点,您使用git hash-object filename 来获取该答案所需的哈希值。

标签: cherry-pick pre-commit git-checkout


【解决方案1】:

首先是一个非 git 的答案。检查你的 shell 命令历史。好吧,如果您没有使用带有命令历史记录的 shell,那么您就不会...

git 的答案。您通常找不到 THE $commit。通常,相同的内容可能是许多提交的一部分,我认为 git 不会记录您签出的单个文件(它会记录 HEAD 以前的值)

这是一个蛮力脚本 git-find-by-contents。使用 $filename 作为参数调用它,它会显示包含此文件的所有提交。正如名字所说 它按内容搜索。所以它会找到任何名称的文件,只要内容匹配。

#! /bin/sh
tmpdir=/tmp/$(basename $0)
mkdir $tmpdir 2>/dev/null
rm  $tmpdir/* 2>/dev/null

hash=$(git hash-object $1)
echo "finding $hash"

allrevs=$(git rev-list --all)
# well, nearly all revs, we could still check the log if we have
# dangling commits and we could include the index to be perfect...

for rev in $allrevs
do
  git ls-tree --full-tree -r $rev >$tmpdir/$rev 
done

cd $tmpdir
grep $hash * 


rm -r $tmpdir

如果有更优雅的方法,我不会感到惊讶,但这在类似情况下对我有用几次。

编辑:同一问题的技术更高版本出现在这里:Which commit has this blob?

【讨论】:

    【解决方案2】:

    我不认为你可以。 Git 只是将该版本的文件加载到索引和您的工作目录中。没有参考跟踪它加载的版本

    如果这是您经常做的事情,您可以编写一个可以使用git diff --cached 执行此操作的脚本,并遍历所有更改该文件的提交。

    【讨论】:

      【解决方案3】:

      你可以使用

      git log <filename>
      

      找出您要签出的提交

      【讨论】:

      • 不,日志将从 HEAD 的提交历史开始。而且我不想搜索日志历史记录,直到找到熟悉的东西,而是自动化的。
      【解决方案4】:

      如果你幸运的话,你也许可以尝试一种非 git 方式:

      history | grep "git checkout.*filename"
      

      【讨论】:

        【解决方案5】:

        试试这个(未经测试;):

        $ for commit in $(git log --format=%h $filename); do
        >  if diff <(git show $commit:$filename) $filename >/dev/null; then
        >    echo $commit
        >  fi
        > done 
        

        【讨论】:

          【解决方案6】:

          简洁优雅:

          $ git log -S"$(cat /path/to/file)"
          

          仅在内容是唯一的情况下才有效,然后对于之前出现的哈希比较答案也是如此。

          它也只显示匹配的第一个版本,而不是全部。

          【讨论】:

            【解决方案7】:

            这里是the details of a script I polished up 作为similar question 的答案,您可以在这里看到它的实际效果:


            (来源:adamspiers.org

            【讨论】:

              猜你喜欢
              • 2015-10-04
              • 2011-04-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-04-13
              相关资源
              最近更新 更多