我有一个存储库,Git在其中显示:
$ git status
# On branch develop
# Your branch is up-to-date with 'origin/develop'.
#
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: pom.xml
#
# 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: src/main/java/fr/SomeClass.java
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# README.md
#
我想以合理快速的方式知道:
pom.xml
)SomeClass.java
)README.md
)我在第一种情况下使用以下命令:
git diff --no-ext-diff --quiet --exit-code 2> /dev/null || w='*'
git diff --no-ext-diff --quiet --exit-code HEAD 2> /dev/null || h='+'
但是,当只有一个文件没有上演时,w
和h
会被*
和+
填充。
$ git status --porcelain
M pom.xml
M src/main/java/fr/SomeClass.java
?? toto
可行,但它打印得很多,而且我正在寻找一些简化打印许多项目的东西,例如:
1 1 1
每个号码分别上演,而不是上演和未跟踪。
我的目的是打印我的存储库是否已更改,以及更改的内容。我不想解析整个输出(这可以用于grep
等,但我想避免这种情况。)
哦,我将它标记为Windows,因为我正在寻找一种适用于Linux的解决方案,但也可以在Windows上使用git-bash。基于Bash 4的解决方案,没有明确的方式在Bash 3中完成它,对我没有多大帮助。
答案 0 :(得分:0)
#!/bin/bash
let untracked_count=0 worktree_count=0 staged_count=0 other_count=0
git status -z --porcelain > status.tmp
while IFS= read -n 2 stat; IFS= read -d '' line; do
case "$stat" in
(\?\?) (( untracked_count++ )) ;;
(\ ?) (( worktree_count++ )) ;;
(?\ ) (( staged_count++ )) ;;
(M?) (( worktree_count++ )) ; (( staged_count++ )) ;;
*) (( other_count++ )) ;;
esac
done < status.tmp
使用bash builtin git status -z --porcelain
阅读read
输出,以获取我们关注的信息,然后计算我们看到的内容。第一次读取时IFS
是必要的,以避免shell转储前导或尾随空格。在这种情况下,第二次读取的IFS
是非常必要的,但是通过行&#34;读取输入&#34;我使用的模式。
使用bash 4将允许更少重复的案例标签集(通过使用;;&
)。
附注:,可以这样做:
while IFS= read -n 2 stat; IFS= read -d '' line; do
..
done < <(git status -z --porcelain)
但<(...)
重定向未在Windows上的Git Bash中实现。