384 Stimmen

Kann ich git diff für nicht getrackte Dateien verwenden?

Ist es möglich zu fragen git diff nicht verfolgte Dateien in die Diff-Ausgabe einbezieht, oder ist es am besten, wenn ich git add auf die neu erstellten Dateien und die bereits bearbeiteten Dateien anwenden:

git diff --cached

?

367voto

araqnid Punkte 116680

Mit aktuellen Git-Versionen können Sie git add -N die Datei (oder --intent-to-add ), wodurch dem Index an dieser Stelle ein Blob mit der Länge Null hinzugefügt wird. Das Ergebnis ist, dass Ihre "untracked"-Datei nun zu einer Änderung wird, um den gesamten Inhalt dieser Datei mit der Länge Null hinzuzufügen, was in der "git diff"-Ausgabe angezeigt wird.

git diff

echo "this is a new file" > new.txt
git diff

git add -N new.txt
git diff
diff --git a/new.txt b/new.txt
index e69de29..3b2aed8 100644
--- a/new.txt
+++ b/new.txt
@@ -0,0 +1 @@
+this is a new file

Leider können Sie, wie bereits erwähnt, nicht git stash während Sie eine --intent-to-add anhängige Datei wie diese. Wenn Sie jedoch Dateien auslagern müssen, fügen Sie die neuen Dateien einfach hinzu und lagern sie dann aus. Oder Sie können die Emulation Workaround verwenden:

git update-index --add --cacheinfo \
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt

(die Einrichtung eines Alias ist hier sehr hilfreich).

144voto

Harold Punkte 4919

Ich glaube, Sie können einen Vergleich zwischen Dateien in Ihrem Index und nicht verfolgten Dateien durchführen, indem Sie einfach den Pfad zu beiden Dateien angeben.

git diff --no-index tracked_file untracked_file

55voto

user1587520 Punkte 2359

Nicht 100%ig zutreffend, aber wenn Sie aus irgendeinem Grund Ihre Dateien nicht in den Index aufnehmen wollen, wie in der akzeptierten Antwort vorgeschlagen, gibt es eine weitere Möglichkeit:

Wenn die Dateien nicht getrackt sind, ist der Diff natürlich die ganze Datei, so dass Sie sie einfach mit weniger anzeigen können:

less $(git ls-files --others --exclude-standard)

Navigieren Sie zwischen ihnen mit :n y :p für die nächste und vorherige

Update aus den Kommentaren: Wenn Sie ein Patch-Format benötigen, können Sie es auch kombinieren mit git diff :

git ls-files --others --exclude-standard -z | xargs -0 -n 1 git --no-pager diff /dev/null | less

Sie können in diesem Fall auch die Ausgabe in eine Datei umleiten oder einen anderen diff-Befehl verwenden.

45voto

Jo Liss Punkte 27127

Für mein tägliches interaktives Gitting (ich vergleiche ständig den Arbeitsbaum mit dem HEAD und möchte, dass nicht verfolgte Dateien im Vergleich enthalten sind), add -N/--intent-to-add ist unbrauchbar, weil es bricht git stash .

Hier ist also mein git diff Ersatz. Es ist keine besonders saubere Lösung, aber da ich es wirklich nur interaktiv benutze, ist es für mich in Ordnung, wenn ich es hacke:

d() {
    if test "$#" = 0; then
        (
            git diff --color
            git ls-files --others --exclude-standard |
                while read -r i; do git diff --color -- /dev/null "$i"; done
        ) | `git config --get core.pager`
    else
        git diff "$@"
    fi
}

Einfach tippen d schließt nicht verfolgte Dateien in das Diff ein (was für mich in meinem Arbeitsablauf wichtig ist), und d args... verhalten sich wie normale git diff .

Anmerkungen:

  • Wir nutzen hier die Tatsache, dass git diff ist eigentlich nur eine Verkettung einzelner Diffs, so dass es nicht möglich ist, die d Ausgabe eines "echten diff" -- mit der Ausnahme, dass alle nicht verfolgten Dateien zuletzt sortiert werden.
  • Das einzige Problem bei dieser Funktion ist, dass die Ausgabe eingefärbt wird, auch wenn sie umgeleitet wird; aber ich habe keine Lust, dafür eine Logik hinzuzufügen.
  • Ich konnte keine Möglichkeit finden, nicht verfolgte Dateien einzuschließen, indem ich einfach eine geschickte Argumentliste für git diff . Wenn jemand herausfindet, wie man das macht, oder wenn vielleicht eine Funktion hinzugefügt wird zu git hinterlassen Sie bitte hier einen Hinweis!

38voto

Amol Pujari Punkte 2114
git add -A
git diff HEAD

Erzeugen Sie bei Bedarf einen Patch, und dann:

git reset HEAD

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X