列出指定 Git 提交后未更改的目录中的所有文件

3
我知道一个git提交更改了目录src/java/task中的多个文件。
我想要列出该目录中在此次提交中被更改的所有文件。
现实世界背景:我正在审核某人所做的更改,并认为他们应该对该目录中的每个文件进行类似的更改。我想知道他们提交中没有更改的任何文件(可能被忽略,或者实际上不需要更改,但我想检查原因)。

你想要一个命令,列出存储库中的所有文件,然后过滤掉提交中已更改的文件? - evolutionxbox
我发现了类似于 git diff-tree --no-commit-id --name-only -r HEAD | xargs -n1 -I % sh -c 'tree -fia . | grep -v %' 的东西,但我不知道它有什么用处。 - evolutionxbox
@evolutionxbox 是的,虽然实际上我只关心这种情况下存储库中特定的子目录。 - Chris R
2个回答

2

If you can use bash:

comm -23 <(find src/java/task | sort) <(git diff-tree --no-commit-id --name-only -r $COMMIT_HASH | sort)

comm命令接受两个文件并生成一个包含三列的输出,第一列是文件1中唯一的行,第二列是文件2中唯一的行,第三列是两个文件共有的行。

我们将src/java/task目录中所有文件的列表作为第一个文件:

注:Original Answer翻译成“最初的回答”

find src/java/task | sort

作为第二个文件,是自上次提交以来被更改的文件。"Original Answer"翻译成"最初的回答"。
git diff-tree --no-commit-id --name-only -r $COMMIT_HASH | sort

我们需要在第一个文件中独特的文件(未更改的文件),因此我们只需要第一列。使用“comm -23”作为参数将抑制第2列和第3列,因此我们只获取第一列。
请注意,您需要对每个文件的结果进行排序。
您可能需要稍微调整一下,但大体上就是这样做的方法。
最初的回答:我们需要在第一个文件中找到唯一的文件,也就是那些没有被修改过的文件,所以我们只需要第一列。使用“comm -23”作为参数可以去掉第二和第三列,这样我们只会得到第一列。需要注意的是,你需要对每个文件的结果进行排序。可能需要稍微调整一下,但基本上就是这样做的方法。

1
find .src/java/task didn't work as all lines then started with .src whereas the lines from git started src (no .) so all lines were show as different. Instead I used find src/java/task - Chris R
1
对于第二个文件,我使用了以下命令获取提交中更改的文件列表:git diff-tree --no-commit-id --name-only -r commit-hash,如此处所建议:https://dev59.com/PHRC5IYBdhLWcg3wD8xV#424142 - Chris R

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命令完成这个任务,但我还没有找到。


我还没有尝试过这个,不知道它是否能按照我的意愿正常工作,因为在这个答案发布之前,我已经在测试另一个答案了。 - Chris R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接