Question

J'ai des modifications à apporter à un fichier, ainsi qu'à un nouveau fichier, et j'aimerais utiliser git stash pour les ranger pendant que je passe à une autre tâche. Mais git stash par lui-même ne cache que les modifications apportées au fichier existant; le nouveau fichier reste dans mon arbre de travail, encombrant mon travail futur. Comment puis-je cacher ce fichier non suivi?

Était-ce utile?

La solution

Mise à jour du 17 mai 2018:

Les nouvelles versions de git ont maintenant git stash --all qui cache tous les fichiers, y compris les fichiers non suivis et ignorés.
git stash --include-untracked ne concerne plus les fichiers ignorés (testé sur git 2.16.2).

Réponse originale ci-dessous:

Attention, ceci effacera définitivement vos fichiers si vous avez des entrées directory / * dans votre fichier gitignore.

Depuis la version 1.7.7, vous pouvez utiliser git stash --include-untracked ou git stash save -u pour stocker des fichiers non suivis sans les stocker.

Ajoutez ( git add ) le fichier et commencez à le suivre. Puis cachez. Étant donné que tout le contenu du fichier est nouveau, il sera caché et vous pourrez le manipuler si nécessaire.

Autres conseils

À partir de la version 1.7.7, stash git accepte l'option - include-untracked (ou -u ). Pour inclure des fichiers non suivis dans votre réserve, utilisez l'une des commandes suivantes:

git stash --include-untracked
git stash -u

Avertissement, faire cela supprimera définitivement vos fichiers si vous avez des entrées directory / * dans votre fichier gitignore.

Ajoutez le fichier à l'index:

git add path/to/untracked-file
git stash

L'intégralité du contenu de l'index, ainsi que les modifications non mises en scène des fichiers existants, figureront dans la réserve.

Dans git bash, le stockage des fichiers non suivis est réalisé à l'aide de la commande

git stash --include-untracked

ou

git stash -u

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

git stash supprime tous les fichiers non suivis ou non traités de votre espace de travail. Et vous pouvez restaurer git stash en utilisant les commandes suivantes

git stash pop

Ceci replacera le fichier dans votre espace de travail local.

Mon expérience

J'ai dû modifier mon fichier gitIgnore pour éviter le déplacement des fichiers .classpath et .project dans le référentiel distant. Je ne suis pas autorisé à déplacer ce .gitIgnore modifié dans le dépôt distant à partir de maintenant.

Les fichiers .classpath et .project sont importants pour eclipse - qui est mon éditeur java.

J'ai tout d'abord ajouté de manière sélective mon reste des fichiers et engagé pour le transfert. Cependant, le push final ne peut être effectué que si les fichiers .gitIgnore modifiés et les fichiers non suivis sont viz. .project et .classpath ne sont pas cachés.

j'ai utilisé

 git stash 

pour stocker le fichier .gitIgnore modifié.

Pour stocker les fichiers .classpath et .project, j'ai utilisé

<*>

et il a supprimé les fichiers de mon espace de travail. L'absence de ces fichiers me prive de la possibilité de travailler sur mon lieu de travail dans éclipse. J'ai poursuivi la procédure pour envoyer les fichiers validés à distance. Une fois que cela a été fait avec succès, j'ai utilisé

<*>

Ceci a collé les mêmes fichiers dans mon espace de travail. Cela m'a rendu ma capacité à travailler sur le même projet dans Eclipse. J'espère que cela effacera les idées fausses.

Comme cela a été dit ailleurs, la réponse est de git ajouter le fichier. par exemple:

git add path/to/untracked-file
git stash

Cependant, la question est également posée dans une autre réponse: que se passe-t-il si vous ne voulez pas vraiment ajouter le fichier? Eh bien, autant que je sache, vous devez le faire. Et ce qui suit NE ne fonctionnera pas:

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

cela échouera comme suit:

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

Alors, que pouvez-vous faire? Eh bien, vous devez vraiment ajouter le fichier, cependant , vous pouvez effectivement le dés-ajouter ultérieurement, avec 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

Ensuite, vous pouvez continuer à travailler dans l'état où vous vous trouviez avant git add (à savoir avec un fichier non suivi nommé chemin / vers / fichier non suivi ; plus toutes les autres modifications que vous auriez pu avoir pour suivre les fichiers).

Une autre possibilité pour un flux de travail à ce sujet serait quelque chose comme:

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

[Remarque: comme mentionné dans un commentaire de @mancocapac, vous souhaiterez peut-être ajouter - exclude-standard à la commande git ls-files ( oui, git fichiers-ls -o --exclude-standard ).]

... qui pourrait aussi être facilement scripté - même les alias feraient (présenté dans la syntaxe zsh; ajustez au besoin) [aussi, j'ai raccourci le nom du fichier pour que tout soit affiché à l'écran sans défilement dans cette réponse; sentez-vous libre de substituer un autre nom de fichier de votre choix]:

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'

Notez que ce dernier peut être préférable en tant que script ou fonction shell, pour permettre aux paramètres d'être fournis à stash git , au cas où vous ne voudriez pas que pop apply et / ou souhaitez pouvoir spécifier un stock spécifique, plutôt que de prendre le premier. Peut-être ceci (au lieu du deuxième alias, ci-dessus) [espaces blancs dépouillés pour s'adapter sans défilement; rajouter pour une lisibilité accrue]:

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

Remarque : dans ce formulaire, vous devez fournir un argument d'action, ainsi que l'identificateur, le cas échéant, par exemple. unstashall applique stash @ {1} ou unstashall pop stash @ {1}

Ce que vous auriez bien sûr mis dans votre .zshrc ou équivalent pour faire exister à long terme.

J'espère que cette réponse est utile pour quelqu'un, car elle rassemble tous les éléments en une seule réponse.

Sur la version 2.8.1 de git: la suite fonctionne pour moi.

Pour enregistrer des fichiers modifiés et non suivis en cache sans nom

git stash save -u

Pour enregistrer des fichiers modifiés et non suivis avec un nom

git stash save -u <name_of_stash>

Vous pouvez utiliser l'une ou l'autre des options et appliquer plus tard comme suit.

git stash pop

git stash apply stash@{0}

J'ai pu stocker seulement les fichiers non suivis en faisant:

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}

Le dernier fait apparaître la réserve des fichiers suivis, ne laissant ainsi que les fichiers non suivis stockés.

Si vous voulez cacher des fichiers non suivis tout en conservant les fichiers indexés (ceux que vous êtes sur le point de valider, par exemple), ajoutez simplement l'option -k (conserver l'index) au - u

git stash -u -k

Vous pouvez simplement le faire avec la commande ci-dessous

git stash save --include-untracked

ou

git stash save -u

Pour en savoir plus sur le cachet git, Visitez ce post (Cliquez ici)

Supposons que le fichier nouveau et non suivi s'appelle: "views.json". si vous voulez changer de branche en stockant l'état de votre application, je tape généralement:

git add views.json

Ensuite:

git stash

Et ce serait caché. Ensuite, je peux changer de branche avec

git checkout other-nice-branch

Il existe plusieurs réponses correctes ici, mais je tenais à souligner que pour les nouveaux répertoires entiers, 'git add path' sera NON . travail. Donc, si vous avez un tas de nouveaux fichiers dans untracked-path , procédez comme suit:

git add untracked-path
git stash "temp stash"

ceci sera caché avec le message suivant:

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

et si untracked-path est le seul chemin que vous stockez, le contenu "stash stem" & st; sera une cachette vide. La bonne façon est d’ajouter le chemin complet, pas seulement le nom du répertoire (c’est-à-dire terminer le chemin avec un '/'):

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

J'ai pensé que cela pourrait être résolu en indiquant à git que le fichier existe, plutôt que de valider tout son contenu dans la zone de transfert, puis d'appeler git stash . Araqnid décrit comment procéder.

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

ou

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

Cependant, ce dernier ne fonctionne pas:

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

J'avais l'habitude de réfléchir et de désirer la même fonctionnalité. Mais au fil du temps, j'ai remarqué que ce n'était vraiment pas nécessaire. Lorsque vous stockez, vous pouvez laisser les nouveaux fichiers. Rien & mauvais; " peut leur arriver (lorsque vous extrayez quelque chose d’autre, git commettra une erreur sans écraser le fichier non suivi existant)

Et comme d'habitude le délai entre le git stash et le git stash pop est plutôt court, vous aurez rapidement besoin du fichier non suivi. Je dirais donc que le fichier apparaît dans git status lorsque vous travaillez sur quelque chose d'autre (entre le git stash et le git stash pop ) est plus petit que le désagrément causé par le travail et nécessite une attention particulière, sinon il en coûterait autrement d'essayer d'ajouter le fichier non suivi à votre réserve.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top