2013-04-30 4 views
15

Hier ist ein kurzer Schnipsel Beispiel (die Sie in Ihrem Linux-Terminal einfügen können), ein neues git Repository Erstellen und Hinzufügen einiger Dateien, um es (git Version 1.7.9.5 verwenden):Lassen git Status unmodifizierte/unveränderte Tracking-Dateien anzeigen?

cd /tmp/ 
mkdir myrepo_git 
cd myrepo_git/ 
git init 
git config user.name "Your Name" 
git config user.email [email protected] 
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" 

Jetzt, nach der initial commit, ich möchte die file_tracked_changed.txt Dateien ändern und die anderen (hier nur file_tracked_unchanged.txt) unverändert für den nächsten Commit behalten. Unten ist ein Ausschnitt, der die (Ausgabe mit # vorangestellt ist git Shell), und die verschiedenen Ausgänge git status vs git ls-files zeigt:

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 

Was ich suche, ist ein Befehl, der alle Dateien aufgespürt wird zeigen, in ein Verzeichnis (das git ls-files -v tut), mit ihren genauen Repository-Status (die git ls-files nicht zeigt, wie es H als Status für alle verfolgten Dateien zeigt). Zum Beispiel würde ich so etwas wie der Pseudo-Code zu erhalten, wie:

git status-tracked 
# M file_tracked_changed.txt 
# . file_tracked_unchanged.txt 

... wo der Punkt . wäre ein Symbol für den ein aufgespürt, aber unveränderte Datei (wenn ich mich richtig erinnere, kann SVN verwenden, um ein Zeichen U für diese).

Letztlich würde Ich mag auch den Status aller Dateien in einem Verzeichnis zeigen, wie in dem Pseudo-Code:

git status-tracked-and-untracked 
# M file_tracked_changed.txt 
# . file_tracked_unchanged.txt 
# ?? file_untracked.txt 

... aber es ist mir wichtiger, um den Status aller zu erhalten Tracking-Dateien, wie in der Pseudo git status-tracked oben.

Irgendwelche Befehle in git, die schon so etwas tun?

+0

Versuchen 'git status -sb' – Kartik

+2

Vielen Dank für den Kommentar @Kartik - aber dieser Befehl zeigt verfolgt modifiziert + nicht geparkt; Ich bin auf der Suche nach einem Befehl, der verfolgt verfolgt + unmodifiziert verfolgt zeigt. Prost! – sdaau

Antwort

0
git status -s | egrep -v '^\?\?' 

Diese filtert Linien aus, die mit ?? beginnen, das heißt, die untracked Dateien.

+1

Danke für die Antwort, @Andomar - aber leider zeigt dieser Befehl nicht die verfolgten aber unmodifizierten Dateien, was ich fragen möchte. Prost! – sdaau

+1

'git ls-tree --name-status HEAD' sollte tun, was Sie wollen, aber es ignoriert stillschweigend den' -Status' Teil :) – Andomar

+0

Vielen Dank, @Andomar - toller Tipp, ich hatte keine Ahnung von 'ls-tree ', aber wie du sagst, die Status werden nicht angezeigt - also habe ich gerade [eine Antwort] gepostet (http://stackoverflow.com/a/16308182/277826), die die Status aus' git's 'status'" verschachtelt " und 'ls-Dateien'. Prost! – sdaau

3

Dank @Andomar, für die git ls-tree Spitze; das ist, was es zeigt:

git ls-tree --name-status HEAD 
# file_tracked_changed.txt 
# file_tracked_unchanged.txt 

... aber ich will :)

 

OK Status, hier ist eine Lösung, die beide ls-files und status Aufruf und Verschachtelung sie mit ein wenig bash-Analyse:

git ls-files -cdmoskt --abbrev=8 | while read -r line; do \ 
    fn=$(echo "$line" | sed 's/.*\s\(\w\+\)/\1/'); \ 
    st=$(git status -s "$fn" | printf "%-02s " $(sed 's/\([[:print:]]\+\)\s.*/\1/')); \ 
    echo "$st- $line"; \ 
done 

Wenn Sie dies wie im OP Beispiel ausführen, erhalten Sie:

git ls-files -cdmoskt --abbrev=8 | while read -r line; do fn=$(echo "$line" | sed 's/.*\s\(\w\+\)/\1/'); st=$(git status -s "$fn" | printf "%-02s " $(sed 's/\([[:print:]]\+\)\s.*/\1/')); echo "$st- $line"; done 
# ?? - ? file_untracked.txt 
# M - H 100644 52e7a08e 0 file_tracked_changed.txt 
# - H 100644 9daeafb9 0 file_tracked_unchanged.txt 

... was im Grunde das ist, was ich wollte. (Ich werde hier zurück posten, wenn ich Glück habe, dies in einen git Alias ​​umzuwandeln).


EDIT: hier als git alias (für ~/.gitconfig):

ls-fstatus = "! cd $PWD/$GIT_PREFIX; git ls-files -cdmoskt --abbrev=8 | while read -r line; do \ 
    fn=$(echo \"$line\" | sed \"s/.*\\s\\([[:print:]]\\+\\)/\\1/\"); \ 
    st=$(git status -s "$fn" | printf \"%-02s \" $(sed \"s/\\([[:print:]]\\+\\)\\s.*/\\1/\")); \ 
    echo \"$st- $line\"; \ 
    done " 

... so kann man einfach anrufen git ls-fstatus in einem bestimmten git Repo-Unterverzeichnis.

+0

Dies behandelt keine Pfade mit Leerzeichen. Durch Anführungszeichen um das Argument zu cd funktioniert es: 'cd \ $ PWD/$ GIT_PREFIX \"; ' – KeithB

7

Dank @sdaau. Ich habe ein paar Änderungen vorgenommen, so dass es läuft viel schneller, und liefert Ergebnisse in dem gleichen Format wie 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 
+0

^Sehr nützlich, aber immer noch etwas langsam, weil es einen git_status für jede einzelne Datei ausführt. – frnhr

1

Inspiriert von @RogerDueck's answer, ich ein Drehbuch gemacht, die git ls-files und git status jeweils nur einmal ausgeführt wird. Es läuft etwa 15 Mal schneller auf meinem Repo mit ~ 1700 Dateien, knapp 2 Sekunden.

EDIT: Added eine Reihe von Fehlerbehebungen und einige Unittests, zog nach GitHub: https://github.com/frnhr/git-fullstatus

Beispielausgabe:

M some/file 
D another/file 
D more/files/blahblah 
A this/is/an/added/file/i/think 
    an/unchanged_file 
    another/unchanged_file 
Verwandte Themen