列出目录中未被特定git commit更改的所有文件

时间:2019-07-05 10:31:21

标签: git

我知道git commit更改了目录中的多个文件 src/java/task

它要列出该提交中未更改的所有文件。

真实环境:我正在审查某人的更改,并认为他们应该对该目录中的每个文件进行类似的更改。我想知道他们提交中没有更改的任何文件(这些文件可能已经丢失,或者实际上不需要更改,但是我想检查原因)。

2 个答案:

答案 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命令可以完成这项工作,但我还找不到。