web-dev-qa-db-fra.com

Comment cachez-vous un fichier non suivi?

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?

1214
skiphoppy

Pour cacher votre répertoire de travail, y compris les fichiers non suivis (en particulier ceux qui se trouvent dans le fichier .gitignore), vous voudrez probablement utiliser cette cmd:

git stash --include-untracked

Plus de détails:

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 touche plus les fichiers ignorés (testé sur git 2.16.2).

Réponse originale ci-dessous:

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

À partir de 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.

1592
sykora

A partir de la version 1.7.7, git stash 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

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

388
John Kary

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 place apportées aux fichiers existants, le seront toutes dans la réserve.

70
skiphoppy

Dans git bash, le stockage de fichiers non suivis est réalisé en utilisant 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 validés de votre espace de travail. Et vous pouvez restaurer git stash en utilisant les commandes suivantes

git stash pop

Cela 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é sélectivement mon reste des fichiers et validé pour la mise en scène. 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é

git stash --include-untracked

et il a supprimé les fichiers de mon espace de travail. L'absence de ces fichiers diminue ma capacité à travailler sur mon lieu de travail dans Eclipse. 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é

git stash pop

Cela 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 élimine les idées fausses.

49
DolphinJava

Comme il a été dit ailleurs, la réponse est git add le fichier. par exemple.:

git add path/to/untracked-file
git stash

Cependant, la question se pose également 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 PAS fonctionne:

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 peux-tu faire? Eh bien, vous devez vraiment ajouter le fichier cependant , vous pouvez effectivement le dés-ajouter plus tard, 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

Et vous pouvez ensuite continuer à travailler dans le même état que vous aviez avant le git add (à savoir avec un fichier non suivi appelé path/to/untracked-file; plus toute autre modification 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 (donc, git ls-files -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 à git stash, au cas où vous ne voudriez pas pop mais apply, et/ou voulez être en mesure de spécifier une réserve 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'identifiant si vous voulez fournir un identifiant de cache, par exemple unstashall apply stash@{1} ou unstashall pop stash@{1}

Lequel vous mettriez bien sûr dans votre .zshrc ou équivalent pour faire exister à long terme.

Espérons que cette réponse est utile à quelqu'un, en mettant tout ensemble dans une seule réponse.

20
lindes

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

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

git stash save -u

Pour sauvegarder en cachette des fichiers modifiés et non suivis avec un nom

git stash save -u <name_of_stash>

Vous pouvez utiliser l'un ou l'autre et appliquer plus tard comme suit.

git stash pop

git stash apply stash@{0}
13
user1012513

J'ai pu cacher juste 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.

7
Oded

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

git stash -u -k
3
Tdy

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 git stash visitez ce post (cliquez ici)

2
shubham mishra

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
2
martline1

Il y a plusieurs réponses correctes ici, mais je voulais souligner que pour les nouveaux répertoires entiers, 'git add path' sera PAS travail. Donc si vous avez un tas de nouveaux fichiers dans untracked-path et faites ceci:

git add untracked-path
git stash "temp stash"

cela va cacher 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, la réserve "temp stash" sera une réserve 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"
1
DrStrangepork

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 faire le premier.

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
0
Andrew Grimm