【发布时间】:2022-12-15 04:39:42
【问题描述】:
当我执行 git status 时,我得到如下信息:
modified a/mega/super/duper/long/path/to/the/file/foo.php
modified a/mega/super/duper/long/path/to/the/file/another/folder/bar.php
modified a/mega/super/duper/long/path/to/the/file/someotherfolder/blahblah.php
如果我想查看 bar.php-file(第 2 行)有什么变化,我该怎么做?
我希望能够做这样的事情:
git diff */bar.php
git diff bar.php
那个 git 可以用制表符完成或读懂我的想法。 :-)
想法1:写出来:
必须写的内容非常广泛:
git diff a/mega/super/duper/long/path/to/the/file/another/folder/bar.php
思路二:使用鼠标+复制/粘贴
我可以使用鼠标和复制粘贴,但这似乎也是一个糟糕的解决方案。将手指从键盘上移开通常不是解决方案。我必须做很多。
思路三:Git添加补丁
通过运行git add -p,我自动进入交互模式,能够执行a bunch of stuff。但这并不是我所追求的。
想法4:使用sed
我发现了这个问题:git diff just the first file,这表明:
git diff $(git diff --name-only | sed -n '1 p')
然后我可以设置一个 Alfred-sn-p 或打印它的 bash 脚本。此后,我可以将 1 更改为我想查看的文件数。
这接近于好。
想法 5:将 nth 文件的文件名复制到剪贴板的 Bash 脚本
另一种方法是制作一个 bash 脚本,将 nth 文件复制到剪贴板。然后我可以用两个快速命令来完成,就像这样:
./copy-file-name-for-first-file-in-git-status.sh # Named to make easy to understand.
git diff [PASTE]
这实际上也可以解决下面的奖金问题。
奖金问题 - git add 和 git log 的相同问题
同样的问题存在,如果我不想做git add .,但想在深层嵌套文件夹中单独添加文件。然后我还必须为每个文件键入整个路径。
【问题讨论】:
-
您可以制作一个 bash 函数,使用
find获取某个文件的完整路径,然后为您调用git diff。 -
git diff 可以接受多个值。但是您可以将其包含在函数中。你期望发生什么?总是从find开始走第一条路?如果找到多个文件则取消?
-
git diff -- **/bar.php工作正常(当shopt -s globstar之前已运行时)。你想问什么? -
顺便说一句,
anything $(find ...)是一种反模式,代码天生就有问题,should never be run by anyone。一个典型的更安全的替代品看起来像find ... -exec anything {} + -
顺便说一句,要注意的一件事是对 glob 进行评估通过你的外壳,在您正在运行的命令(如 git)启动之前。所以git没有机会寻找历史的不存在的文件:glob 被替换为当前存在的匹配文件列表在 git 启动之前只要存在任何此类文件。