【问题标题】:Split git diff --name-status by line break按换行符拆分 git diff --name-status
【发布时间】:2012-02-03 08:24:47
【问题描述】:

我正在尝试使用 git 从两次提交中导出已更改文件的列表,使用以下命令:

read -ra ADDR <<< `git diff --name-only HEAD..HEAD~1 | sed -e "s/ /\\\ /g"`
for i in "${ADDR[@]}"; do 
    echo "$i"
done

这很好用。我在终端上打印了一个很好的列表,每个文件都在一个新行上。

file1.txt
file2.txt
file3.txt

但是,我想使用 --name-status 而不是 --name-only。原因是我以后可以根据所做的更改(例如 M 或 D)做不同的事情。

但这不起作用。我得到以下格式的列表:

M
file1.txt
M
file2.txt
M
file3.txt

我尝试将IFS 变量更改为$'\n'(返回一行中的所有内容)、$'\t'(返回第一行,例如M file1.txt)和' '(与\t 相同)成功。

【问题讨论】:

  • 你能在你的 sed 脚本中添加 ';/^M$/d' 来删除那些只是 M 的行吗。祝你好运。
  • 当我运行git diff --name-status &lt;com1&gt;..&lt;com2&gt; 时,我得到一个文件名列表,状态在第一列。我不确定您的 sed 命令为您提供什么。我的bash不是最好的,所以我不能举个例子,但我认为你可以用awk得到你想要的,它可以让你按位置抓取字段,并输出它们。 thegeekstuff.com/2010/01/…

标签: git bash git-bash


【解决方案1】:
while read STATUS ADDR
do
    echo "$ADDR ($STATUS)"
done  < <(git diff --name-status HEAD..HEAD~1)

例如像 git 输出一样

M       INSTALL
M       debian/changelog
M       src/lib/libnvpair/SConscript
M       src/lib/libzfscommon/SConscript
M       src/lib/libzpool/SConscript
M       src/zfs-fuse/main.c

while 循环会打印以下内容:

INSTALL (M)
debian/changelog (M)
src/lib/libnvpair/SConscript (M)
src/lib/libzfscommon/SConscript (M)
src/lib/libzpool/SConscript (M)
src/zfs-fuse/main.c (M)

【讨论】:

    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2012-01-21
    • 2014-04-21
    • 2013-04-01
    相关资源
    最近更新 更多