我知道git commit更改了目录中的多个文件
src/java/task
它要列出该提交中未未更改的所有文件。
真实环境:我正在审查某人的更改,并认为他们应该对该目录中的每个文件进行类似的更改。我想知道他们提交中没有更改的任何文件(这些文件可能已经丢失,或者实际上不需要更改,但是我想检查原因)。
答案 0 :(得分:2)
如果可以使用bash:
comm -23 <(find src/java/task | sort) <(git diff-tree --no-commit-id --name-only -r $COMMIT_HASH | sort)
comm
接收两个文件并生成包含三列的输出,第一列是file1唯一的行,第二列是file2唯一的行,第三列是两个文件中都出现的行。
我们将src / java / task目录中所有文件的列表作为第一个文件:
find src/java/task | sort
作为第二个文件,是自上次提交以来已更改的文件
git diff-tree --no-commit-id --name-only -r $COMMIT_HASH | sort
我们需要第一个文件中唯一的文件(文件未更改),因此我们只需要第一列。使用-23作为comm参数将取代第2列和第3列,因此我们仅获得第一列。
请注意,您需要对每个文件的结果进行排序。
您可能需要稍微调整一下,但这或多或少是一种方法。
答案 1 :(得分:1)
#!/bin/bash
commit=$1
# all files under src/java/task/, excluding subfolders
all=$(git ls-tree ${commit}:src/java/task | awk '/ blob /{print "src/java/task/"$4}')
# files changed by the commit
changed=$(git show ${commit} --pretty= --name-only)
# files not changed by the commit
for f in ${all} ${changed} ${changed};do
echo ${f}
done | sort | uniq -u
假设脚本为foo.sh
,存储库位于/path/to/foo/
,提交为HEAD
。要运行脚本,
GIT_DIR=/path/to/foo/.git bash foo.sh HEAD
可能有一个带有一些魔术选项的git命令可以完成这项工作,但我还找不到。