git:确定是否存在不在repo上的文件,但是应该添加

时间:2014-08-22 08:07:06

标签: linux git bash windows-7 git-bash

我有一个存储库,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='+'

但是,当只有一个文件没有上演时,wh会被*+填充。

$ 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中完成它,对我没有多大帮助。

1 个答案:

答案 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将允许更少重复的案例标签集(通过使用;;&)。

Linux上的

附注:,可以这样做:

while IFS= read -n 2 stat; IFS= read -d '' line; do
  ..
done < <(git status -z --porcelain)

<(...)重定向未在Windows上的Git Bash中实现。