从git status的bash输出中创建字符串数组

3

我正在尝试创建一个字符串数组,其中包含我修改过的git文件,以便在bash程序中使用。示例输出:

On branch restructured
Your branch is up-to-date with 'origin/restructured'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified: path/to/file1 
    modified: path/to/file2

我正在尝试获取 modified: 后面的文本,但是从我找到的资料来看,grep不支持换行符,所以我不知道如何将原始输出转换为可处理的内容。


3
我建议从使用 git status --porcelain 命令开始,该命令专门为更容易解析而设计... - twalberg
3个回答

8
如果您只需要修改文件的列表,请考虑使用 git ls-files -m。如果您需要一些可扩展到可能的其他类型更改的东西:
git status --porcelain | while read -r status file; do
  case "$status" in 
    M) printf '%s\n' "$file";;
  esac
done

3

如何使用:

files=(git status | grep '^\s*modified:' | cut -f 2- -d :)

从里到外阅读,它的含义是:

  • git status 输出作为参数传递给 grep 命令,该命令
  • 仅查找包含单词 modified: 的行,接着
  • 截取冒号后面的所有内容,并对这些行执行此操作,最后
  • 将结果赋值给数组变量 $files

2
文件=$(git ls-files -m) - Dave

1
你正在错误地看待这个问题。
Git "status" 是从许多基础命令中派生出来的漂亮视图。
“更改”文件列表是通过以下命令检索的。
$ git diff --name-only --diff-filter=M
modifiedfile.txt

diff-filter可以是以下内容:

  • A 新增的文件
  • C 复制的文件
  • D 删除的文件
  • M 修改过的文件
  • 等等,请查看手册。

您也可以尝试使用支持-d,-m,-a和-o的ls-files。

如果您正在寻找尚未跟踪的新文件,则可以尝试

$ git ls-files -o
untrackedfile.txt

作为最后的手段,如果您真的坚持尝试解析git-status的输出,请考虑使用“--short”或“--porcelain”输出选项。 --short会产生彩色输出,而--porcelain则避免了这种情况。
$ git status --short
 M modifiedfile.txt
?? untrackedfile.txt

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