让git status显示未修改/未更改的跟踪文件?

sda*_*aau 17 git version-control

这是一个简短的代码段示例(您可以将其粘贴到Linux终端中),创建一个新的git存储库并向其添加一些文件(使用git版本1.7.9.5):

cd /tmp/
mkdir myrepo_git
cd myrepo_git/
git init
git config user.name "Your Name"
git config user.email you@example.com
echo "test" > file_tracked_unchanged.txt
echo "test" > file_tracked_changed.txt
echo "test" > file_untracked.txt
git add file_tracked_unchanged.txt 
git add file_tracked_changed.txt
git commit -m "initial commit"
Run Code Online (Sandbox Code Playgroud)

现在,在初始提交之后,我想要更改file_tracked_changed.txt文件,并保持其他(此处,仅file_tracked_unchanged.txt)在下一次提交时保持不变.下面是一个片段,演示了git statusvs git ls-files(gitshell输出的前缀是多种输出#):

echo "test more" >> file_tracked_changed.txt

git status -uno
# # On branch master
# # 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:   file_tracked_changed.txt
# #
# no changes added to commit (use "git add" and/or "git commit -a")
git status
# # On branch master
# # 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:   file_tracked_changed.txt
# #
# # Untracked files:
# #   (use "git add <file>..." to include in what will be committed)
# #
# # file_untracked.txt
# no changes added to commit (use "git add" and/or "git commit -a")
git status -uno --short
#  M file_tracked_changed.txt
git status --short
#  M file_tracked_changed.txt
# ?? file_untracked.txt
git ls-files -v
# H file_tracked_changed.txt
# H file_tracked_unchanged.txt

git add file_tracked_changed.txt

git status -uno
# # On branch master
# # Changes to be committed:
# #   (use "git reset HEAD <file>..." to unstage)
# #
# # modified:   file_tracked_changed.txt
# #
# # Untracked files not listed (use -u option to show untracked files)
git status
# # On branch master
# # Changes to be committed:
# #   (use "git reset HEAD <file>..." to unstage)
# #
# # modified:   file_tracked_changed.txt
# #
# # Untracked files:
# #   (use "git add <file>..." to include in what will be committed)
# #
# # file_untracked.txt
git status -uno --short
# M  file_tracked_changed.txt
git status --short
# M  file_tracked_changed.txt
# ?? file_untracked.txt
git ls-files -v
# H file_tracked_changed.txt
# H file_tracked_unchanged.txt
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是一个命令,它将显示目录中的所有跟踪文件(git ls-files -v确实如此),具有准确的存储库状态(git ls-files未显示,因为它显示H为所有跟踪文件的状态).例如,我想获得类似伪代码的东西:

git status-tracked
# M file_tracked_changed.txt
# . file_tracked_unchanged.txt
Run Code Online (Sandbox Code Playgroud)

...其中点.是一个符号,表示一个跟踪但未更改的文件(如果我没记错的话,SVN可能会使用一个U字符).

最后,我还要显示目录中所有文件的状态,如伪代码:

git status-tracked-and-untracked
# M file_tracked_changed.txt
# . file_tracked_unchanged.txt
# ?? file_untracked.txt
Run Code Online (Sandbox Code Playgroud)

...但是对于我来说,获取所有跟踪文件的状态更为重要,如git status-tracked上面的伪.

任何命令git,已经做了这样的事情?

Rog*_*eck 7

谢谢@sdaau.我做了一些更改,以便它运行得更快,并以相同的格式提供结果git status:

git ls-files | while read -r line;
do
    st=$(git status -s "$line");
    if [ -n "$st" ]; then
        echo "$st";
    else
        echo "   $line";
    fi;
done
Run Code Online (Sandbox Code Playgroud)


小智 7

适用于 Linux 的快速单线:

sort -uk 2bi <(git status -s) <(git ls-files | sed 's/^/ . /')


And*_*mar -1

git status -s | egrep -v '^\?\?'
Run Code Online (Sandbox Code Playgroud)

这会过滤掉以 开头的行??,即未跟踪的文件。

  • 感谢您的回答,@Andomar - 但不幸的是,该命令没有显示跟踪但未修改的文件,这就是我要问的。干杯! (2认同)