这似乎是一个非常直截了当的问题,an answer here,但它并非相当我正在寻找的答案。
以下是故事:
我在完成工作时与develop
合并的功能分支上进行了大部分开发。在我合并之前删除功能分支,我想回顾一下我做过的事情。要获取我需要查看的文件列表,我这样做:
git --no-pager diff --name-only develop..HEAD
因此,举例来说,我可能会看到类似这样的内容:
file1.js
path1/file2.js
path1/file3.js
这告诉我,我已对这些文件进行了更改,我需要进入&回顾他们。
问题是这些文件路径都是相对于存储库的根目录。我喜欢在我的编辑器中打开所有相关文件:
git --no-pager diff --name-only develop..HEAD | xargs atom
如果我当前位于存储库的根目录下,这将打开atom中不同选项卡中的所有文件,以供我查看。
但是,如果我碰巧在不同的目录中(例如,如果我cd
加入path1
做某事),我会在atom
次尝试时获得一堆空标签打开不存在的文件。在开始我的审核之前,我必须记住cd
回到存储库的根目录。
今天早上经常让我烦躁,所以我去寻找解决方案。我发现the answer cited above建议在命令中添加--relative
选项,如下所示:
git --no-pager diff --relative --name-only develop..HEAD
这种工作,但它只给我在存储库中的目录或其下的文件。因此,在上面的示例中,如果我cd
加入path1
,我会看到:
file2.js
file3.js
我真正希望看到的是:
../file1.js
file2.js
file3.js
这将允许我将其传送到atom
并打开所有文件。
我确实阅读了git help
命令的diff
文档,--relative
标记 允许您指定路径,但它也排除了外部文件路径。
没有写这么长的命令行:
pushd "$(git rev-parse --show-toplevel)" >/dev/null \
&& git --no-pager diff --name-only develop..HEAD | xargs atom \
&& popd > /dev/null
有没有办法获取两个提交之间更改的所有文件的列表,其中包含相对于当前目录的路径?
答案 0 :(得分:0)
Git没有内置任何功能,但编写脚本或别名很容易。
请注意,git rev-parse --show-cdup
会显示要添加到当前目录的../
- es字符串,以便进入顶层。如果您已经处于最顶层,则结果为空。因此:
git diff --name-only "$@" | sed -e "s,^,$(git rev-parse --show-cdup),"
如果你不介意../sub/file.js
只能说file.js
,就会让你足够近。如果你做的话,另外一个-e
表达式可以解决这个问题:将../../$whereIam/
替换为空,从$whereIam
之间的差异中填入git rev-parse --show-toplevel
变量}和pwd
。