有没有办法获取本地/远程存储库中所有新的/删除的/修改的目录/文件的列表,并在 Git 中相互关联?
列出这些文件的最佳方法是使用
git status --porcelain
。
例如:
git status --porcelain | awk 'match($1, "D"){print $2}'
显示已从本地副本中删除的跟踪文件。您可以通过向管道附加适当的命令来删除所有这些文件:
git status --porcelain | awk 'match($1, "D"){print $2}' | xargs git rm
我不确定你的意思是什么,但如果你想要一个单独的列表(例如所有修改的文件),你可以使用
git ls-files
和正确的标志(对于修改的文件是 -m
)。如果您想要一次获得所有这些信息,您可以使用 git status --porcelain
来获取状态的脚本可解析输出。
要获取当前更改的文件的文件名和状态,您可以简单地:
git diff --name-status
您将得到如下的裸输出:
M a.txt
M b.txt
现在,将输出通过管道传输到
cut
以提取第二列:
git diff --name-status | cut -f2
然后您将只得到文件名:
a.txt
b.txt
执行此操作的一种方法是使用
whatchanged
命令:
$ git whatchanged
这显示了树中每个提交更改了哪些文件,也可用于查看具体信息。来看看
git help whatchanged
使用
git add
的试运行 (-n) 选项:
git add -A -n
您可能想要的是这样的:
git fetch # update what you know about the remote repo
git diff --name-status master origin/master
但是很难准确说出您想要与问题不同的分支。
就我而言,我需要所有新的/修改的/未跟踪的文件的列表。下面的命令就达到了目的:
git status --porcelain | cut -c 1-3 --complement
cut -c 1-3 --complement
部分用于删除三个初始状态字符,以便我可以使用xargs
对文件运行任意脚本。例如,针对所有新的/更改的 JavaScript 文件(在 Nodejs 存储库中)运行 eslint:
git status --porcelain | cut -c 1-3 --complement | egrep .js$ | xargs npm run lint -- --fix
与命令一起使用
--name-status
带有标签的示例:
git diff v1.0.1 v1.0.2 --name-status
提交示例:
git diff b79810fc4d be69e41d1c --name-status
它将列出所有更新的文件及其状态:
M
- 修改
D
- 已删除
A
- 添加
git diff --name-only
可以完成工作,但它仅显示跟踪的文件。为了包含新文件,您可以(临时)使用 git add .
添加所有文件,现在 git diff --cached --name-only
应列出所有已更改的文件。之后,您可以 git restore --staged .
取消暂存所有文件。
执行
git diff
,您将看到所有已更改的文件以及这些文件中更改内容的详细信息