找到文件所属的git提交?

时间:2016-07-27 19:10:02

标签: git

给定一个随机文件,是否有规范方法从命令行确定该文件是否属于特定提交?

这类似于堆栈溢出问题find-out-which-git-commit-a-file-was-taken-from,除了我希望能够在脚本中使用它并且也不能创建临时分支。

4 个答案:

答案 0 :(得分:2)

以下是我一直用于此目的的脚本摘录。我使用我在网上找到的有限的git知识和其他脚本来一起攻击它。它运作得很好,但我经常发现git中的事情比我通过反复试验所学到的更简单。

FILE=$1

# git hash for file
HASH=`git hash-object $FILE`

# git revisions for file
REVS=`git log --pretty=%H -- $FILE`

# check each revision for checksum match
for rev in $REVS; do
    POSSIBLE=`git ls-tree $rev $FILE | awk '{print $3}'`
    if [[ $HASH == $POSSIBLE ]]; then
        echo $rev
    fi
done

答案 1 :(得分:1)

你的意思是,在提交中修改了文件吗?如果是这样的话,像git log --oneline -- filePathName这样的东西应该列出HEAD的提交情况。

在第二次阅读时,我认为您只是要求提交包含该文件的提交,无论其是否已更改。如果是这样,那么你的ls-tree不需要一个-r标志来递归到它的子树(子目标)?如果您只是在sha上匹配,它将以任何名称找到文件的任何副本。

答案 2 :(得分:1)

Your approach可能无法在文件的本地版本和存储库版本之间存在微不足道的差异(例如行结束样式或由于清除/污迹过滤器引起的差异)的情况下工作。

以下脚本通过git diff工作,而不是依赖于哈希。它接受文件名后的diff选项。

用法示例:

# list all commits that introduce the file README.md in its local state
list_introducing_commits README.md

# list all commits that introduce the file README.md in its local state
# ignoring any difference in whitespace
list_introducing_commits README.md -w

list_introducing_commits (无法找到更好的名字):

#!/bin/bash

if [ $# -eq 0 ]
then
    echo "Usage: $(basename $0) path/to/file [<diff-options>]"
    exit 1
fi

file="$1"
shift 1

for rev in $(git log --pretty=%H -- "$file")
do
    if git diff --exit-code $@ $rev -- $file &> /dev/null
    then
        echo $rev
    fi
done

答案 3 :(得分:1)

DavidNanswer上构建,如果文件在当前工作树中,并且工作树与HEAD同步,则会获得与文件当前内容对应的提交: / p>

git log --pretty="%H" -1  -- path/to/file

但您可能希望通过“git diff --exit-code /path/to/file”提前测试这些假设,然后查看$?