Wie erhalte ich den Git-Status eines einzelnen Unterordners?

81

Wenn ich den Git-Status in einem Unterordner meines Repositorys mache, enthält er auch den Status der übergeordneten Ordner.

Gibt es eine Möglichkeit, den Git-Status auf einen bestimmten Ordner zu beschränken?

EoghanM
quelle
1
Nein, "Git-Status". gibt Geschwisterordner als zB "../sibling"
EoghanM
Würde es Ihnen etwas ausmachen, etwas mehr Kontext darüber anzugeben, warum Sie Änderungen an anderer Stelle in Ihrem Baum herausfiltern möchten? In welchen Situationen möchten Sie diese Funktion verwenden?
Greg Bacon
1
Wenn der normale Befehl "git status" mehr als einen Bildschirmwert ausgibt
EoghanM

Antworten:

100
git status .

zeigt den Status des aktuellen Verzeichnisses und der Unterverzeichnisse an.

Zum Beispiel gegebene Dateien (Zahlen) in diesem Baum:

a/1
a/2
b/3
b/4
b/c/5
b/c/6

git statuszeigt im Unterverzeichnis "b" neue Dateien im gesamten Baum an:

% git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   ../a/1
#   new file:   ../a/2
#   new file:   3
#   new file:   4
#   new file:   c/5
#   new file:   c/6
#

git status .zeigt aber nur Dateien in "b" und darunter.

% git status .
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   3
#   new file:   4
#   new file:   c/5
#   new file:   c/6
#

Nur dieses Unterverzeichnis, nicht unten

git status .zeigt alle Dateien unter "b" rekursiv an. Um nur die Dateien im "b", aber nicht unten anzuzeigen, müssen Sie eine Liste nur der Dateien (und nicht der Verzeichnisse) an übergeben git status. Dies ist ein bisschen fummelig, abhängig von Ihrer Shell.

Zsh

In zsh können Sie normale Dateien mit dem "glob qualifier" auswählen (.). Zum Beispiel:

% git status *(.)
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

Bash

Bash hat keine Glob-Qualifikationsmerkmale, aber Sie können GNU verwenden find, um normale Dateien auszuwählen und sie dann git statuswie folgt weiterzugeben :

bash-3.2$ find . -type f -maxdepth 1 -exec git status {} +
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

Dies verwendet -maxdeptheine GNU-Find- Erweiterung. POSIX find hat nicht -maxdepth, aber Sie können dies tun:

bash-3.2$ find . -path '*/*' -prune -type f -exec git status {} +
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4
Matt Curtis
quelle
2
Es hat so lange gedauert, bis wir auf diese Antwort zurückgekommen sind - einfach und richtig! Ich frage mich, ob <Pfadspezifikation> nach meiner Frage zum Git-Status hinzugefügt wurde.
EoghanM
Was ist, wenn Sie nur an dem aktuellen Ordner interessiert sind, auf den verwiesen wird ., nicht jedoch auf dessen Unterordner? Irgendeine Arbeit dafür? Vielen Dank!
Benjamin
@benjaminz hängt von Ihrer Verwendung ab - für solche Dinge verwende ich Shell-Globbing, um Dateien auszuwählen, aber keine Unterverzeichnisse, z. B. (für zsh) git status *(.). Bash hat keine Kurzform, um nur Dateien zu globalisieren, aber Sie könnten eine erweiterte findz find . -type f -maxdepth 1 -exec git status {} +. Scheint so, als würden Sie einen Alias ​​oder ein Skript einfügen, anstatt die ganze Zeit zu tippen.
Matt Curtis
3

Einige Installationsbefehle verwenden ein Verzeichnis als Parameter:

git ls-files -t -o -m aDirectory

würde Ihnen alle Dateien geben, die geändert, aber nicht aktualisiert (nicht zur Bühne hinzugefügt) oder nicht verfolgt wurden. Und das für ein Verzeichnis.

Wie in diesem Thread geschrieben , unterstützt git ls-files keine --addedOption.

Ein grundlegenderer Grund ist, dass es bei der ls-filesInstallation um den Index geht .
Beim Hinzufügen geht es nicht um einen Vergleich zwischen dem Index und dem Arbeitsbaum.
Es befindet sich zwischen dem HEAD-Commit und dem Index und gehört nicht zu ls-files plumbing.

Verwenden Sie also die hier genannten Befehle :

git diff-index --name-only -B -R -M -C HEAD src

würde Ihnen sowohl nicht hinzugefügte als auch hinzugefügte Dateien geben

git diff-files --name-only -B -R -M -C src

würde Ihnen nur nicht hinzugefügte Dateien geben. (beim Erkennen von Umschreibungen, Umbenennungen, Kopien, ...)

Wie bei Installationsbefehlen üblich, sind einige Skripte angebracht;)

VonC
quelle
3

Unvollkommen, aber dies funktioniert auch in dem Verzeichnis, an dem Sie interessiert sind:

git status | grep -v ' \.\./'

Dadurch werden alle Verzeichnisse ausgeblendet, für deren relativen Pfad eine Aufwärtsreferenz erforderlich wäre.

Wenn Sie Farbe spuckt das andere Ende erhalten möchten, setzen Sie color.statusauf always:

git config color.status always
Marcus Griep
quelle
2
Ich finde es toll, dass grep immer eine provisorische Lösung anbietet, wenn Sie keine spezifischere kennen. Prost auf die Taco-Bell-Programmierung.
Murftown
Das ist viel mächtiger!
Benjamin
2

Es ist möglich, sich git statusauf das aktuelle Verzeichnis (ohne untergeordnete Ordner) zu beschränken , indem Sie eine Pfadangabe mit dem Zauberwort globund *::

git status ':(glob)*'
Joël Conraud
quelle
Das funktioniert super! Genau das, wonach ich gesucht habe!
Poindexter
1

Als ich es mit Git versuchte, fand ich keinen Weg, das zu tun.

Am Ende tat ich:

x@x:~/x$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       b
#       main/a
nothing added to commit but untracked files present (use "git add" to track)

x@x:~/x$ git status | grep main
#       main/a
Macarse
quelle
Dies ist die Methode, die ich verwendet habe ... im Folgenden werden auch die Statusüberschriften angezeigt: git status | grep "main \ |: \ $" ... leider verlieren Sie die Farbe.
EoghanM
Kam über diese Frage auf der Suche nach einem generischen Glob-Match. Dies ist bei weitem am einfachsten und funktioniert für mich, z. B. git status | grep extwo ext die Erweiterung ist. Vielen Dank!
0

cd YOUR_REQUIRED_DIRECTORY, dann
Git-Status.

Ratna Halder
quelle
Dadurch