Frage Wie können Sie eine neue Datei hinzufügen, ohne sie zu staffeln?


Um git effektiv (und wie beabsichtigt) zu verwenden, mache ich kleine atomare Commits, während ich längere Sessions habe, in denen ich nicht nur eine Sache ändere. So mache ich mich stark git add -p. Bei komplett neuen Dateien funktioniert das allerdings nicht, weil ich sie später oft vergesse.

Was ich machen will, erzähle git das da ist eine neue Datei, die ich verfolgen möchte, aber nicht inszenieren:

Beispiel: läuft git status produziert:

# On branch my-current-branch
# Your branch is ahead of 'origin/my-current-branch' by 2 commits.
#
# Changes to be committed:
#
<<STAGED SECTION>> // A
#
# 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)
#
<<UNSTAGED-YET-KNOWN SECTION>> // B
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
<<UNKNOWN SECTION>> // C

Wenn ich eine Datei habe foo in der C-Sektion, und ich sage git add foo es wird in die A-Sektion gehen. Wenn ich sage git add -N foo Es wird sowohl zu A als auch zu B gehen. Das würde jedoch bedeuten, dass es in den nächsten Commit einbezogen wird, zumindest als die Tatsache, dass es eine neue Datei gibt.

Ich möchte, dass es ausschließlich in Abschnitt B geht, so dass ich es später zu A hinzufügen kann git add -p oder git add foo (oder Wasauchimmer).

Bearbeiten

Bezüglich der add -N Lösung, das funktioniert nicht, weil wenn ich versuche, nachdem ich gesagt habe, zu begehen add -N und nicht richtig hinzugefügt, beschwert sich git, weil es nicht weiß, wie man mit leeren Dateien umgeht:

foo: not added yet
error: Error building trees

40
2018-06-18 16:32


Ursprung


Antworten:


Mit Git 2.5, git add -N/--intent-to-add ist eigentlich die richtige Lösung.
Die neue Datei ist nicht Teil des nächsten Commits.

Sehen commit d95d728 von Nguyễn Thái Ngọc Duy (pclouds) (verschmolzen in d0c692263):

diff-lib.c: stelle die Position von i-t-a-Einträgen in diff ein

Problem:

Einträge hinzugefügt von "git add -N"sind Erinnerung für den Benutzer, so dass sie nicht vergessen, sie vor dem Commit hinzuzufügen. Diese Einträge erscheinen im Index, obwohl sie nicht real sind. Ihre Anwesenheit im Index führt zu einem verwirrenden"git status" so was:

On branch master
Changes to be committed:
        new file:   foo

Changes not staged for commit:
        modified:   foo

Wenn du ein "git commit","foo"wird nicht mitgerechnet, obwohl   "status"berichtet es als"to be committed".

Lösung:

Dieser Patch ändert die Ausgabe zu werden

On branch master
Changes not staged for commit:
        new file:   foo

no changes added to commit

Das bedeutet:

Behandle solche Pfade als "noch zum Index hinzuzufügen, aber Git kennt sie bereits";   "git diff HEAD" und "git diff --cached HEAD"sollte nicht über sie reden, und"git diff"sollte sie als neu zeigen.   + Dateien, die noch zum Index hinzugefügt werden sollen.


18
2018-05-20 06:34



Vielleicht könnten Sie versuchen, einen Pre-Commit-Hook zu schreiben, der Sie warnt, wenn Sie nicht nachverfolgte Dateien haben. Dies erfordert, dass Sie Ihr git-Verzeichnis immer sauber halten, um zu arbeiten (und natürlich müssen Sie ein aktuelles .gitignore behalten).

Probiere auch git add -i das ist ähnlich git add -p hat aber auch eine Schnittstelle zum Hinzufügen neuer Dateien.


3
2018-06-18 18:09



Sie könnten eine leere Datei mit diesem Pfad übergeben, bevor Sie Ihre Änderungen vornehmen. Wenn Sie bereits etwas dort geschrieben haben, verschieben Sie die Datei weg, machen Sie eine leere Datei, committen Sie das, fügen Sie dann -p als normal hinzu und git commit --amend Sie haben also kein Commit für "Leere Datei hinzufügen".


1
2018-06-18 16:35