Hoe bewaar je een niet-getrackt bestand?

Ik heb wijzigingen in een bestand, plus een nieuw bestand, en wil git stash gebruiken om ze op te bergen terwijl ik overschakel naar een andere taak. Maar git stash zelf bewaart alleen de wijzigingen aan het bestaande bestand; het nieuwe bestand blijft in mijn werkboom staan ​​en vervuilt mijn toekomstige werk. Hoe bewaar ik dit niet-getrackte bestand?


Antwoord 1, autoriteit 100%

Als je je werkmap wilt opslaan, inclusief niet-getrackte bestanden (vooral die in de .gitignore), dan wil je waarschijnlijk deze cmd gebruiken:

git stash --include-untracked

(U kunt ook de afkorting -ugebruiken in plaats van --include-untracked)

Meer details:

Update 17 mei 2018:

Nieuwe versies van git hebben nu git stash --alldie alle bestanden opslaat, inclusief niet-getrackte en genegeerde bestanden.
git stash --include-untrackedraakt niet langer genegeerde bestanden aan (getest op git 2.16.2).

Oorspronkelijk antwoord hieronder:

Waarschuwing, als je dit doet, worden je bestanden permanent verwijderd als je directory/*-vermeldingen in je gitignore-bestand hebt.

Vanaf versie 1.7.7 kun je git stash --include-untrackedof git stash save -ugebruiken om niet-getrackte bestanden op te slaan zonder ze te stagneren.

Voeg (git add) het bestand toe en begin het te volgen. Dan opbergen. Aangezien de volledige inhoud van het bestand nieuw is, zullen ze worden opgeslagen en kunt u het indien nodig manipuleren.


Antwoord 2, autoriteit 18%

Vanaf git 1.7.7 accepteert git stashde optie --include-untracked(of verkorte -u). Gebruik een van de volgende opdrachten om niet-getrackte bestanden in uw stash op te nemen:

git stash --include-untracked
# or
git stash -u

Waarschuwing, als je dit doet, worden je bestanden permanent verwijderd als je directory/-items in je gitignore-bestand hebt.*


Antwoord 3, autoriteit 4%

Voeg het bestand toe aan de index:

git add path/to/untracked-file
git stash

De volledige inhoud van de index, plus eventuele niet-gefaseerde wijzigingen aan bestaande bestanden, komen allemaal in de stash terecht.


Antwoord 4, autoriteit 2%

In git bash wordt het stashen van niet-getrackte bestanden bereikt door het commando te gebruiken

git stash --include-untracked
# or
git stash -u

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

git stash verwijdert alle niet-getrackte of niet-gecommitteerde bestanden uit je werkruimte. En je kunt git stash terugzetten door de volgende commando’s te gebruiken

git stash pop

Hierdoor wordt het bestand teruggezet in uw lokale werkruimte.

Mijn ervaring

Ik moest een wijziging aanbrengen in mijn gitIgnore-bestand om verplaatsing van .classpath- en .project-bestanden naar een externe repo te voorkomen.
Ik mag deze gewijzigde .gitIgnore vanaf nu niet naar een externe repo verplaatsen.

.classpath- en .project-bestanden zijn belangrijk voor eclipse – dat is mijn java-editor.

Ik heb eerst selectief mijn rest van de bestanden toegevoegd en vastgelegd voor staging. De laatste push kan echter niet worden uitgevoerd tenzij de gewijzigde .gitIgnore-bestanden en de niet-getrackte bestanden, namelijk. .project en .classpath worden niet opgeslagen.

Ik gebruikte

git stash

voor het opbergen van het gewijzigde .gitIgnore-bestand.

Voor het opslaan van .classpath en .project-bestanden gebruikte ik

git stash --include-untracked

en het heeft de bestanden uit mijn werkruimte verwijderd. De afwezigheid van deze bestanden neemt mijn vermogen weg om op mijn werklocatie in eclips te werken.
Ik ging verder met het voltooien van de procedure voor het pushen van de vastgelegde bestanden op afstand.
Nadat dit met succes was gedaan, gebruikte ik

git stash pop

Hiermee heb ik dezelfde bestanden terug in mijn werkruimte geplakt. Dit gaf me mijn vermogen om in eclipse aan hetzelfde project te werken.
Ik hoop dat dit misvattingen opzij zet.


Antwoord 5

Op git-versie 2.8.1: het volgende werkt voor mij.

Om gewijzigde en niet-getrackte bestanden zonder naam in de stash op te slaan

git stash save -u

Om gewijzigde en niet-getrackte bestanden op te slaan in een stash met een naam

git stash save -u <name_of_stash>

Je kunt popof applylater als volgt gebruiken.

git stash pop
git stash apply stash@{0}

Antwoord 6

Zoals elders is gezegd, is het antwoord git addhet bestand. bijv.:

git add path/to/untracked-file
git stash

De vraag wordt echter ook gesteld in een ander antwoord: wat als u het bestand niet echt wilt toevoegen? Nou, voor zover ik weet, moet je wel. En het volgende zal NIETwerken:

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

dit zal als volgt mislukken:

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

Dus, wat kun je doen? Nou, je moet het bestand echt toevoegen, echter, je kunt het later effectief ongedaan maken, met 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

En dan kun je doorgaan met werken, in dezelfde staat als voor de git add(namelijk met een niet-getrackt bestand genaamd path/to/untracked-file; plus eventuele andere wijzigingen die u mogelijk heeft gehad om bestanden bij te houden).

Een andere mogelijkheid voor een workflow hierover zou zoiets zijn als:

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

[Opmerking: zoals vermeld in een opmerking van @mancocapac, wil je misschien --exclude-standardtoevoegen aan de opdracht git ls-files( dus, git ls-files -o --exclude-standard).]

… die ook gemakkelijk te scripten zou kunnen zijn — zelfs aliassen zouden voldoende zijn (gepresenteerd in zsh-syntaxis; pas indien nodig aan) [ook heb ik de bestandsnaam ingekort zodat het allemaal op het scherm past zonder in dit antwoord te scrollen; voel je vrij om een ​​alternatieve bestandsnaam naar keuze te vervangen]:

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'

Merk op dat de laatste misschien beter is als een shellscript of functie, om parameters toe te staan ​​aan git stash, voor het geval je niet wilt dat popmaar apply, en/of wil een specifieke voorraad kunnen specificeren, in plaats van alleen de bovenste te nemen. Misschien is dit (in plaats van de tweede alias hierboven) [witruimte gestript om te passen zonder te scrollen; opnieuw toevoegen voor betere leesbaarheid]:

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

Opmerking: in dit formulier moet u een actieargument en de identifier opgeven als u een stash-identifier gaat opgeven, bijv. unstashall apply stash@{1}of unstashall pop stash@{1}

Wat je natuurlijk in je .zshrcof equivalent zou zetten om op de lange termijn te bestaan.

Hopelijk is dit antwoord nuttig voor iemand, door alles in één antwoord samen te voegen.


Antwoord 7

Ik kon alleende niet-getrackte bestanden opbergen door het volgende te doen:

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}

De laatste opent de stash van de bijgehouden bestanden, waardoor alleen de niet-getrackte bestanden worden opgeborgen.


Antwoord 8

Bijgewerkt antwoord in 2020

Ik was verrast dat geen andere antwoorden op deze pagina git stash pushvermeldden.

Dit artikelheeft me geholpen het volgende te begrijpen:

Het commando git stashis een afkorting voor git stash push. In deze modus zijn niet-optie-argumenten niet toegestaan ​​om te voorkomen dat een verkeerd gespelde subopdracht een ongewenste stash-invoer maakt. Er is ook een andere alias voor dit commando git stash savedie is afgeschaft ten gunste van git stash push.

Standaard negeert git niet-getrackte bestanden bij het doen van stash. Als die bestanden aan de stash moeten worden toegevoegd, kun je -uopties gebruiken die git vertellen om niet-getrackte bestanden op te nemen. Genegeerde bestanden kunnen ook worden toegevoegd als de optie -ais opgegeven. -abevat zowel niet-getrackte als genegeerde bestanden.

Ik vind het belangrijk om mijn stashes een naam te geven en ik wil dat ze niet-getrackte bestanden bevatten, dus het commando dat ik meestal gebruik is:git stash push -u -m "whatIWantToNameThisStash"


Antwoord 9

Als je niet-getrackte bestanden wilt opslaan, maar geïndexeerde bestanden wilt behouden (bijvoorbeeld degene die je op het punt staat vast te leggen), voeg dan de optie -k(index behouden) toe aan de -u

git stash -u -k

Antwoord 10

Je kunt het eenvoudig doen met het onderstaande commando

git stash save --include-untracked

of

git stash save -u

Voor meer informatie over git stash Bezoek dit bericht (klik hier)


Antwoord 11

laten we aannemen dat het nieuwe en niet-getrackte bestand de naam “views.json” heeft. als je van branch wilt veranderen door de status van je app te stashen, typ ik over het algemeen:

git add views.json

Dan:

git stash

En het zou worden opgeborgen. Dan kan ik gewoon van branch veranderen met

git checkout other-nice-branch

Antwoord 12

Ik dacht dat dit kon worden opgelost door git te vertellen dat het bestand bestaat, in plaats van de volledige inhoud ervan in het staging-gebied te zetten, en dan git stashaan te roepen. Araqnid beschrijfthoe het eerste te doen.

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

of

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

Dit laatste werkt echter niet:

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

Antwoord 13

Er zijn hier verschillende juiste antwoorden, maar ik wilde erop wijzen dat voor nieuwe volledige mappen 'git add path'NIETwerk. Dus als je een heleboel nieuwe bestanden hebt in untracked-pathen doe dit:

git add untracked-path
git stash "temp stash"

dit wordt opgeslagen met het volgende bericht:

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

en als untracked-pathhet enige pad is dat u opslaat, zal de stash “temp stash” een lege stash zijn. De juiste manier is om het hele pad toe te voegen, niet alleen de mapnaam (d.w.z. het pad beëindigen met een ‘/’):

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

Antwoord 14

Ik kwam een ​​soortgelijk probleem tegen tijdens het gebruik van Sourcetree met nieuw gemaakte bestanden (ze zouden ook niet in de stash worden opgenomen).

Toen ik eerst ‘stage all’ koos en vervolgens de nieuw toegevoegde componenten opbergde, werden ze bijgehouden en daarom opgenomen in de stash.


Antwoord 15

Hoe bewaar je een niet-getrackt bestand?

git stash --include-untracked

Antwoord 16

Ik dacht altijd na over en verlangde naar dezelfde functie.
Maar na verloop van tijd merkte ik dat het echt niet nodig is.
Wanneer je opslaat, is het OK om de nieuwe bestanden te laten staan. Er kan niets “slechts” met hen gebeuren (wanneer je iets anders uitcheckt, zal git een fout maken en het bestaande niet-gevolgde bestand niet overschrijven)

En aangezien het tijdsbestek tussen de git stashen de git stash popmeestal vrij klein is, zul je het niet-getrackte bestand snel weer nodig hebben.
Dus ik zou zeggen het ongemak van het bestand dat verschijnt in git statusterwijl je aan iets anders werkt (tussen de git stashen de git stash pop) is kleiner dan het ongemak veroorzaakt door het werk en vereist aandacht die het anders zou kosten om het niet-getrackte bestand aan je stash toe te voegen.

Other episodes