Come si nasconde un file non tracciato?


1437

Ho delle modifiche a un file, oltre a un nuovo file, e vorrei usare git stash per metterle via mentre passo a un'altra attività. Ma git stash da solo blocca solo le modifiche al file esistente; il nuovo file rimane nel mio albero di lavoro, ingombrando il mio lavoro futuro. Come riposto questo file non tracciato?


27
Ricorda che se hai solo file non tracciati nella tua scorta, sembrerà che sia vuoto, poiché git stash shownon restituisce nulla e potresti essere tentato di rilasciarlo (come ho appena fatto mentre conteneva uno script utile che ho scritto alcuni mesi fa → come recuperare una scorta abbandonata )
Maxime R.

Risposte:


1925

Per nascondere la directory di lavoro, inclusi i file non tracciati (in particolare quelli che si trovano nel file .gitignore), probabilmente si desidera utilizzare questo cmd:

git stash --include-untracked

Più dettagli:

Aggiornamento 17 maggio 2018:

Le nuove versioni di git ora hanno git stash --allche blocca tutti i file, inclusi i file non monitorati e ignorati.
git stash --include-untrackednon tocca più i file ignorati (testato su git 2.16.2).

Risposta originale di seguito:

Attenzione, facendo questo eliminerai definitivamente i tuoi file se hai qualche directory / * voci nel tuo file gitignore.

A partire dalla versione 1.7.7 è possibile utilizzare git stash --include-untrackedo git stash save -uarchiviare i file non tracciati senza metterli in scena.

Aggiungi ( git add) il file e inizia a tracciarlo. Quindi stash. Poiché l'intero contenuto del file è nuovo, verranno archiviati e sarà possibile manipolarlo se necessario.


4
Perché stash continua a conservare i file esistenti modificati anche se tali modifiche non sono state messe in scena?
Alan Christensen,

6
@ alan-christensen Leggi la DESCRIZIONE di kernel.org/pub/software/scm/git/docs/git-stash.html . Il punto è avere un albero di lavoro pulito dopo lo stashing.
Kelvin,

3
@Kelvin quello che volevo dire nel mio commento è che non nasconde i nuovi file a meno che non siano stati messi in scena, ma conserva i file esistenti anche se non sono stati messi in scena. Mi sembra incoerente.
Alan Christensen,

11
@AlanChristensen il punto è mettere da parte cose che potrebbero essere sovrascritte dal checkout di un altro ramo.
jwg

3
Dato che hai la risposta migliore qui, ti chiedo di elencarlo git stash --include-untrackedprima git stash --allnella tua risposta per due motivi. Prima risponde meglio alla domanda del PO ora nel 2019 e in secondo luogo perché - tutti fanno qualcosa che la maggior parte degli utenti probabilmente non vuole in quanto rimuove tutti i file che sono .gitignored
Daniel Flippance

411

A partire da git 1.7.7, git stashaccetta l' --include-untrackedopzione (o la mano breve -u). Per includere file non tracciati nella scorta, utilizzare uno dei seguenti comandi:

git stash --include-untracked
git stash -u

Attenzione, facendo questo eliminerai definitivamente i tuoi file se hai qualche directory / * voci nel tuo file gitignore.


15
Fantastico: finalmente funziona come descritto nella pagina del manuale. Non riporre (e pulire) i nuovi file è un comportamento non funzionante.
Steve Bennett,

1
la mia versione di git è 1.9.1 e anche se quello che ho .gitignoreappare così ignoredDirectorye non ignoredDirectory/*cancella ancora quelli non tracciati. Anche i file non tracciati non solo le directory.
theUnnown777

22
Potete per favore spiegare l'avvertimento? Perché dovrebbe eliminare quei file? Li elimina e non li nasconde? Ho usato Git per un po 'e non ho riscontrato questo problema.
Aleksandr Dubinsky,

L'avvertimento si applica anche alle *.extensionvoci?
Arekolek,

3
@ aleksandr-dubinsky, l'opzione @arekolek - git1.8.3 -u( --include-untracked) può stash e pop file git stash shownon tracciati, ma non elenca i file non tracciati che si trovano nello stash
xilef

77

Aggiungi il file all'indice:

git add path/to/untracked-file
git stash

L'intero contenuto dell'indice, oltre a qualsiasi modifica non messa in scena dei file esistenti, lo farà diventare uno stash.


Cosa succede se non si desidera nascondere le modifiche che sono già nell'indice? L'archiviazione del nuovo file è ancora possibile?
codice alleato

Effettua il commit dell'indice, nascondi il nuovo file, quindi ripristina il commit e / o controlla i file dal commit. È una soluzione kludgy, ma dovrebbe funzionare.
Gdalya,

git add .non lo stavo prendendo in considerazione per qualche motivo
TheBilTheory il

53

In git bash, lo stash di file non tracciati si ottiene usando il comando

git stash --include-untracked

o

git stash -u

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

git stash rimuove tutti i file non tracciati o non sottoposti a commit dallo spazio di lavoro. E puoi ripristinare git stash usando i seguenti comandi

git stash pop

Ciò riporterà il file nell'area di lavoro locale.

La mia esperienza

Ho dovuto eseguire una modifica al mio file gitIgnore per evitare lo spostamento dei file .classpath e .project nel repository remoto. Non sono autorizzato a spostare questo .gitIgnore modificato nel repository remoto a partire da ora.

I file .classpath e .project sono importanti per eclipse, che è il mio editor java.

Prima di tutto ho aggiunto selettivamente il resto dei miei file e mi sono impegnato per la messa in scena. Tuttavia, il push finale non può essere eseguito a meno che il file .gitIgnore modificato non si trovi e i file non tracciati, cioè. .project e .classpath non sono nascosti.

ero solito

 git stash 

per riporre il file .gitIgnore modificato.

Per stashing .classpath e .project file, ho usato

git stash --include-untracked

e ha rimosso i file dal mio spazio di lavoro. L'assenza di questi file toglie la mia capacità di lavorare sulla mia posizione di lavoro in eclissi. Ho proceduto con il completamento della procedura per il push dei file di commit su remoto. Una volta fatto questo, l'ho usato

git stash pop

Questo ha incollato gli stessi file nel mio spazio di lavoro. Questo mi ha restituito la mia capacità di lavorare sullo stesso progetto in eclissi. Spero che questo elimini le idee sbagliate.


2
Perché non usi gitignore globale per i file IDE? Vale a dire. usare ~/.gitignore.
Antti Pihlaja,

20

Come è stato detto altrove, la risposta è al git addfile. per esempio:

git add path/to/untracked-file
git stash

Tuttavia, la domanda viene sollevata anche in un'altra risposta: cosa succede se non si desidera davvero aggiungere il file? Beh, per quanto posso dire, devi farlo. E quanto segue NON funzionerà:

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

questo fallirà, come segue:

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

Che cosa si può fare? Bene, devi davvero aggiungere il file, tuttavia , puoi effettivamente annullarlo in seguito, con 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

E poi puoi continuare a lavorare, nello stesso stato in cui ti git addtrovavi prima (ovvero con un file non tracciato chiamatopath/to/untracked-file non tracciato ; oltre a qualsiasi altra modifica che potresti aver dovuto tenere traccia dei file).

Un'altra possibilità per un flusso di lavoro su questo sarebbe qualcosa di simile:

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

[Nota: come menzionato in un commento di @mancocapac, potresti voler aggiungere --exclude-standardal git ls-filescomando (quindi,git ls-files -o --exclude-standard ).]

... che potrebbe anche essere facilmente copiato - anche gli alias lo farebbero (presentati nella sintassi di zsh; regolare secondo necessità) [inoltre, ho abbreviato il nome del file in modo che si adatti allo schermo senza scorrere in questa risposta; sentiti libero di sostituire un nome file alternativo di tua scelta]:

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'

Si noti che quest'ultimo potrebbe essere migliore come script di shell o funzione, per consentire ai parametri di essere forniti git stash, nel caso in cui non si desideri popma apply, e / o si desideri poter specificare uno stash specifico, piuttosto che prendere semplicemente la parte superiore uno. Forse questo (al posto del secondo alias, sopra) [spazi bianchi ridotti per adattarsi senza scorrere; aggiungere nuovamente per una maggiore leggibilità]:

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

Nota : in questo modulo, è necessario fornire un argomento di azione e l'identificatore se si intende fornire un identificatore di scorta, ad es. unstashall apply stash@{1}Ounstashall pop stash@{1}

Quale ovviamente avresti inserito nel tuo .zshrc o equivalente per far esistere a lungo termine.

Spero che questa risposta sia utile a qualcuno, mettendo tutto insieme in un'unica risposta.


1
git ls-files -o mostra molti più file di quelli a cui sono interessato. dal seguente stato git ho trovato l'aggiunta di opere --exclude-standard. git ls-files -o --exclude-standard. La mia opinione su questo è che "include" solo i file non monitorati che normalmente non ignoreresti, cioè mostra solo i file non monitorati che il tuo .gitignore non
filtrerebbe

20

Su git versione 2.8.1: segue funziona per me.

Per salvare i file modificati e non tracciati nello stash senza un nome

git stash save -u

Per salvare i file modificati e non tracciati nello stash con un nome

git stash save -u <name_of_stash>

Puoi usare pop o applicare in seguito come segue.

git stash pop

git stash apply stash@{0}

Ciò non ha rimosso i file non tracciati dal mio computer, sebbene non fossero più elencati come non tracciati. git stash shownon li ha mostrati. Quando ho provato git stash apply, ho ricevuto "errore: impossibile ripristinare i file non tracciati da stash". Tuttavia, i file sono stati nuovamente elencati come non tracciati, ma le modifiche ai file tracciati non sono state ripristinate. Penso che quei file possano essere ripristinati individualmente controllandoli dalla scorta, ma questa soluzione non era quella che speravo.
hBrent

9

Sono stato in grado di nascondere solo i file non monitorati facendo:

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}

L'ultimo apre la scorta dei file tracciati, lasciando quindi solo i file non tracciati.


git stash save -unon solo salva i untrackedfile, ma salva sia il trackede untracked. Penso che il primo salvataggio che stai facendo non sia necessario in questo caso. C'è un buon diagramma in atlassian.com/git/tutorials/saving-changes/…
Drenai,

2
La domanda è come riporre solo i file non tracciati. Se salti la prima scorta, cosa farai? L'idea è di: 1) Stash monitorato. 2) Stash non tracciato. 3) Pop tracciato. Risultato: non tracciato rimane nascosto.
Oded,

3

Se vuoi archiviare file non tracciati, ma mantieni i file indicizzati (ad esempio quelli che stai per eseguire il commit), aggiungi l' -kopzione (mantieni indice) al-u

git stash -u -k


2

supponiamo che il file nuovo e non tracciato sia chiamato: "views.json". se vuoi cambiare ramo nascondendo lo stato della tua app, generalmente scrivo:

git add views.json

Poi:

git stash

E sarebbe nascosto. Quindi posso solo cambiare ramo con

git checkout other-nice-branch

1

Ci sono diverse risposte corrette qui, ma ho voluto sottolineare che per i nuovi intere directory, 'git add path'sarà non lavoro. Quindi se hai un sacco di nuovi file nel percorso non tracciato e fai questo:

git add untracked-path
git stash "temp stash"

questo verrà nascosto con il seguente messaggio:

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

e se il percorso non tracciato è l'unico percorso che stai nascondendo, lo "stash temporaneo" sarà uno stash vuoto. Il modo corretto è aggiungere l'intero percorso, non solo il nome della directory (ovvero terminare il percorso con un '/'):

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

Almeno sul mio sistema il tuo presupposto è sbagliato. Funziona senza la barra! Le directory vuote vengono comunque ignorate. (macos git 2.6.2)
phobie,

0

Ho pensato che questo potesse essere risolto dicendo a git che il file esiste, piuttosto che affidare tutto il suo contenuto nell'area di gestione temporanea, e quindi chiamare git stash. Araqnid descrive come fare il primo.

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

o

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

Tuttavia, quest'ultimo non funziona:

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

1
Per quanto ne so, neanche il primo funziona. Vedi la mia risposta per una soluzione a questo problema.
scade il

0
git stash --include-untracked

il mio preferito in quanto salva anche i file che hai aggiunto e non li hai messi in scena.


0

Ho riscontrato un problema simile durante l'utilizzo di Sourcetree con i file appena creati (che non sarebbero stati inclusi nello stash).

Quando ho scelto per la prima volta 'stage all' e poi ho nascosto i componenti appena aggiunti dove sono stati tracciati e quindi inclusi nello stash.


Questa domanda ha 11 anni e ha già 14 risposte. Li hai letti prima di pubblicare?
Mickael B.

-7

Riflettevo e desideravo la stessa caratteristica. Ma col passare del tempo, ho notato che non è davvero necessario. Quando riponi, è OK lasciare i nuovi file. Non può accadere nulla di "male" (quando si verifica qualcos'altro, git si commette un errore e non sovrascrive il file non tracciato esistente)

E poiché di solito l'intervallo di tempo tra il git stashe il git stash popè piuttosto piccolo, avrai bisogno di nuovo rapidamente del file non tracciato. Quindi direi che l'inconveniente del file che appare git statusmentre stai lavorando su qualcos'altro (tra il git stashe il git stash pop) è più piccolo dell'inconveniente causato dal lavoro e della necessaria attenzione, altrimenti costerebbe provare ad aggiungere il file non tracciato a la tua scorta.


15
Dipende dal progetto. Supponiamo che il file non tracciato sia un test unitario (scritto per metà) e che il cablaggio di test esegua tutti i test unitari nella directory. Ecc.
Steve Bennett,

1
Un altro esempio è se lavori su due computer e ti è permesso spostare i dati da A a B, ma non da B ad A. Se crei un nuovo codice per risolvere un problema che si verifica per primo su B ma che tu vuoi sia su A che su B, vuoi essere in grado di archiviare il file su B in modo che quando ricrea il file su A e poi lo porti in un bundle, puoi diffondere la versione stash per verificare che non hai fare un errore.
Gdalya,

7
Solo perché un file non viene tracciato in un ramo, non significa che non entrerà in conflitto con un file tracciato in un altro ramo.
jwg

3
semplice contro-esempio: file di configurazione nella directory .conf.d, o qualsiasi altro che solo lì si modifica il comportamento del software.
fotanus

Naturalmente è necessaria la funzionalità. Non è possibile, come esempio aggiuntivo, passare da un ramo all'altro se si dispone di file localmente non tracciati che si desidera riporre.
Demitrian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.