给定一个随机文件,是否有规范方法从命令行确定该文件是否属于特定提交?
这类似于堆栈溢出问题find-out-which-git-commit-a-file-was-taken-from,除了我希望能够在脚本中使用它并且也不能创建临时分支。
答案 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)