Frage Wie speichern Sie eine nicht verfolgte Datei?


Ich habe Änderungen an einer Datei, plus eine neue Datei, und ich möchte Git Stash verwenden, um sie weg zu legen, während ich zu einer anderen Aufgabe wechseln. Aber git stash speichert nur die Änderungen an der vorhandenen Datei. Die neue Datei bleibt in meinem Arbeitsbaum und überlastet meine zukünftige Arbeit. Wie kann ich diese nicht verfolgte Datei speichern?


932
2018-05-07 15:54


Ursprung


Antworten:


Update 17. Mai 2018:

Neue Versionen von Git haben jetzt git stash --all die alle Dateien speichert, einschließlich nicht verfolgter und ignorierter Dateien.
git stash --include-untracked berührt nicht mehr ignorierte Dateien (getestet auf Git 2.16.2).

Ursprüngliche Antwort unten:

Achtung, dabei werden Ihre Dateien endgültig gelöscht, wenn Sie in Ihrer Gitignore-Datei irgendwelche Verzeichnisse / * Einträge haben.

Ab Version 1.7.7 können Sie verwenden git stash --include-untracked oder git stash save -u unverdeckte Dateien speichern, ohne sie zu stapeln.

Hinzufügen (git add) die Datei und starten Sie es zu verfolgen. Dann verstauen. Da der gesamte Inhalt der Datei neu ist, werden sie gespeichert und Sie können sie bei Bedarf ändern.


1180
2018-05-07 16:02



Ab Git 1.7.7, git stash akzeptiert die --include-untracked Option (oder Short-Hand -u). Verwenden Sie einen der folgenden Befehle, um nicht verfolgte Dateien in Ihren Stash einzubinden:

git stash --include-untracked
git stash -u

Achtung, dabei werden Ihre Dateien endgültig gelöscht, wenn Sie in Ihrer Gitignore-Datei irgendwelche Verzeichnisse / * Einträge haben.


351
2017-07-25 15:49



Fügen Sie die Datei dem Index hinzu:

git add path/to/untracked-file
git stash

Der gesamte Inhalt des Index sowie alle nicht geänderten Änderungen an vorhandenen Dateien werden alle in den Stash übernommen.


55
2018-05-07 15:57



In git bash wird das Verbergen von nicht-verfolgten Dateien mit dem Befehl erreicht

git stash --include-untracked

oder

git stash -u

http://git-scm.com/docs/git-stash

git stash entfernt nicht verfolgte oder nicht erzwungene Dateien aus Ihrem Arbeitsbereich. Und Sie können den Git-Speicher mit den folgenden Befehlen zurücksetzen

git stash pop

Dadurch wird die Datei wieder in Ihrem lokalen Arbeitsbereich gespeichert.

Meine Erfahrung

Ich musste eine Änderung an meiner gitIgnore-Datei vornehmen, um die Bewegung von .classpath- und .project-Dateien in Remote-Repo zu vermeiden. Ich bin nicht berechtigt, dieses modifizierte .gitIgnore in Remote-Repo ab sofort zu verschieben.

.classpath und .project Dateien sind wichtig für Eclipse - das ist mein Java Editor.

Ich habe zunächst selektiv meinen Rest der Dateien hinzugefügt und zum Staging verpflichtet. Endgültige Push-Vorgänge können jedoch nicht ausgeführt werden, es sei denn, die modifizierten .gitIgnore-Felder und die nicht nachverfolgten Dateien. .project und .classpath sind nicht versteckt.

ich benutzte

 git stash 

zum Speichern der modifizierten .gitIgnore-Datei.

Zum Speichern von .classpath- und .project-Dateien habe ich verwendet

git stash --include-untracked

und es entfernte die Dateien von meinem Arbeitsbereich. Das Fehlen dieser Dateien führt dazu, dass ich nicht mehr an meinem Arbeitsplatz in Eclipse arbeiten kann. Ich fuhr fort mit dem Abschluss der Prozedur zum Übertragen der festgeschriebenen Dateien auf Remote. Sobald dies erfolgreich gemacht wurde, habe ich verwendet

git stash pop

Dadurch wurden die gleichen Dateien in meinen Arbeitsbereich eingefügt. Dies gab mir die Möglichkeit, an demselben Projekt in Eclipse zu arbeiten. Hoffe, dass dies Missverständnisse beiseite lässt.


44
2017-08-28 20:46



Wie an anderer Stelle gesagt wurde, lautet die Antwort: git add die Datei. z.B.:

git add path/to/untracked-file
git stash

Die Frage wird jedoch auch in einer anderen Antwort gestellt: Was ist, wenn Sie die Datei nicht wirklich hinzufügen möchten? Nun, soweit ich das beurteilen kann, müssen Sie. Und folgendes wird NICHT Arbeit:

git add -N path/to/untracked/file     # note: -N is short for --intent-to-add
git stash

Dies wird wie folgt fehlschlagen:

path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

Also was kannst du tun? Nun, Sie müssen wirklich die Datei hinzufügen, jedochSie können es später effektiv mit hinzufügen git rm --cached:

git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop   # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file

Und dann kannst du weiterarbeiten, in demselben Zustand wie vor dem git add (nämlich mit einer nicht verfolgten Datei namens path/to/untracked-file; sowie alle anderen Änderungen, die Sie möglicherweise bei der Verfolgung von Dateien hatten).

Eine andere Möglichkeit für einen Workflow wäre etwa:

git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack

[Anmerkung: Wie in einem Kommentar von @mancocapac erwähnt, möchten Sie vielleicht hinzufügen --exclude-standard zum git ls-files Befehl (so, git ls-files -o --exclude-standard).]

... die auch leicht zu scripten wäre - sogar Aliase würden das tun (dargestellt in der zsh-Syntax; nach Bedarf anpassen) [außerdem habe ich den Dateinamen gekürzt, damit alles auf den Bildschirm passt, ohne in dieser Antwort zu scrollen; Fühlen Sie sich frei, einen alternativen Dateinamen Ihrer Wahl zu ersetzen]:

alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'

Beachten Sie, dass letzteres möglicherweise besser als Shell-Skript oder -Funktion ist, um die Bereitstellung von Parametern zu ermöglichen git stash, falls du nicht willst pop aber applyund / oder möchten einen bestimmten Speicher angeben, anstatt nur den obersten zu nehmen. Vielleicht dieses (anstelle des zweiten Alias, oben) [Whitespace entkleidet, um ohne Scrollen zu passen; für bessere Lesbarkeit neu hinzufügen]:

function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}

Hinweis: In diesem Formular müssen Sie ein Aktionsargument sowie den Bezeichner angeben, wenn Sie eine Stash-ID angeben möchten, z. unstashall apply stash@{1} oder unstashall pop stash@{1}


17
2018-02-06 02:00



Auf git Version 2.8.1: folgendes funktioniert für mich.

So speichern Sie geänderte und nicht geordnete Dateien im Speicher ohne Namen

git stash save -u

So speichern Sie geänderte und nicht geordnete Dateien im Speicher mit einem Namen

git stash save -u <name_of_stash>

Sie können entweder Pop verwenden und später wie folgt anwenden.

git stash pop

git stash apply stash@{0}

8
2018-02-20 09:23



Ich konnte mich verstecken gerade die nicht nachverfolgten Dateien durch:

git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop stash@{1}

Die letzte Datei ruft den Speicher der verfolgten Dateien auf und lässt nur die nicht gespeicherten Dateien zurück.


4
2018-05-06 22:33



Es gibt mehrere richtige Antworten hier, aber ich wollte darauf hinweisen, dass für neue ganze Verzeichnisse, 'git add path' werden NICHT Arbeit. Also, wenn du eine Menge neuer Dateien hast untracked-Pfad und tu dies:

git add untracked-path
git stash "temp stash"

Dies wird mit der folgenden Nachricht gespeichert:

Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty

und wenn untracked-Pfad ist der einzige Weg, den du versteckst, der Stash "Temp Stash" wird ein leerer Stash sein. Der richtige Weg besteht darin, den gesamten Pfad hinzuzufügen, nicht nur den Verzeichnisnamen (d. H. Den Pfad mit einem '/' zu beenden):

git add untracked-path/
git stash "temp stash"

1
2017-08-19 23:59



Ich dachte, dass das gelöst werden könnte, indem ich git sage, dass die Datei existiert, anstatt den gesamten Inhalt davon an den Bereitstellungsbereich zu übergeben, und dann anrufe git stash. Araqnid beschreibt wie man das erstere macht.

git add --intent-to-add path/to/untracked-file

oder

git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file

Letzteres funktioniert jedoch nicht:

$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

0
2017-10-11 10:10