从Git whatchanged中提取文件名的Bash脚本

3
我正在尝试获取所有更改的 JS 文件列表,以便知道需要重新压缩哪些文件。
我之前提出了这个问题:此处链接 到目前为止,以下是我想到的最好方法,但感觉不够安全。
GITCHANGES=$(git whatchanged -n 1 --pretty=format:)
I=0;
for f in $GITCHANGES;
do
    I=$(($I + 1));
    if [[ $(($I % 6 )) == 0 ]]; then
        echo "$f"
    fi
done

但是,这个命令返回的是所有发生改变的文件 (php css js),而不仅仅是 js 文件。

我该如何只获取 js 文件呢?此外,有更好的实现方式吗?


如果你只是试图重新压缩文件,也许你应该在压缩时记录修改时间戳(你可以在一个点文件中保留列表),然后只需查阅该文件以查看哪些需要重新压缩。 - Lily Ballard
顺便说一下,你从git whatchanged -n 1 --pretty=format:输出的结果基本上和git diff-tree HEAD^ HEAD做的事情是一样的,所以也许你应该使用后者,特别是因为你可以执行像传递--name-only标志这样的操作。 - Lily Ballard
可能是重复的问题:如何在Git中列出提交的所有文件 - Schwern
@Schwern:不是重复问题,请检查答案评论。 - qwertymk
@qwertymk 答案下的评论是“谢谢,完美地解决了问题”和“谢谢,就是这样完美”。我错过了什么吗?你只需要 grep '\.js$' 吗? - Schwern
2个回答

3
这个答案中,使用git show --pretty="format:" --name-only HEAD^获取更改文件的列表。然后通过grep进行筛选。
git show --pretty="format:" --name-only HEAD^ | grep '\.js$'

git whatchanged -n 1 --pretty=format: --name-only | grep '\.js$' - qwertymk
@qwertymk 是的,那样做更好。否则它会选择 git log 中最后一次提交,否则 HEAD^ 可能会走到合并的错误侧面。顺便说一下,我误解了你上面所提到的答案,抱歉。 - Schwern

1

你的脚本可以非常简单地压缩成

git diff-tree --name-only HEAD^ HEAD | grep '\.js$'

这将输出一个列表,其中包含在HEAD^(第一个父级)和HEAD之间不同的所有.js文件。


diff-tree 返回已更改的目录,而不是文件。至少根据我的测试结果是这样的。 - Schwern
我认为你需要在 diff-tree 命令中加上 -r 参数。 - Schwern
它还输出了提交ID,这可能被脚本错误地当作文件名。你需要使用tail -n +2去除第一行,这是GNU的特性,或者用sed组合一些东西。(对不起,我正在研究这个问题,所以一直在纠正) - Schwern
@Schwern:啊,我测试库中的提交仅涉及顶级文件,所以我忘记了递归部分。无论如何,使用-r参数,它会给出精确的输出结果。我在git diff-tree命令的输出中看不到任何提交ID信息,也不应该有,因为它只是在比较树。 - Lily Ballard
@Schwern:额外的“啊嗯”:如果你只是简单地说git diff-tree -r --name-only HEAD(即仅提供一个树状物),它会输出提交ID。如果你提供两个,它就不会输出。 - Lily Ballard
@KevinBallard 是的,命令应该是 git diff-tree -r --name-only HEAD^..HEAD - thebugfinder

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