给定一个随机文件,是否有一种标准方法可以从命令行确定文件是否属于特定提交?
这类似于stackoverflow上的问题find-out-which-git-commit-a-file-was-taken-from,但我希望能够在脚本中使用它,并且不创建临时分支。
给定一个随机文件,是否有一种标准方法可以从命令行确定文件是否属于特定提交?
这类似于stackoverflow上的问题find-out-which-git-commit-a-file-was-taken-from,但我希望能够在脚本中使用它,并且不创建临时分支。
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
git log --pretty=...
更改为git rev-list --all -- $FILE
,我不会改变您回答中的任何内容。 - Bryce Drewgit log --oneline -- filePathName
这样的命令应该列出从HEAD开始的包含这种情况的提交。你的方法在本地和仓库版本文件之间存在微小差异时可能会失效(例如行尾样式或由清理/涂抹过滤器引起的差异)。
以下脚本通过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
git log -1 -- $filename
(可能对“属于”的含义有些困惑)。您能否稍微重新表述一下? - trent