Question Comment stockez-vous un fichier non suivi?


J'ai des changements dans un fichier, plus 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 futur travail. Comment puis-je stocker ce fichier non suivi?


932
2018-05-07 15:54


origine


Réponses:


Mise à jour 17 mai 2018:

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

Réponse originale ci-dessous:

Attention, cela supprimera définitivement vos fichiers si vous avez des entrées de répertoire / * 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 les fichiers non suivis sans les mettre en scène.

Ajouter (git add) le fichier et commencer à le suivre. Puis cacher. Puisque tout le contenu du fichier est nouveau, ils seront cachés et vous pourrez le manipuler si nécessaire.


1180
2018-05-07 16:02



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

git stash --include-untracked
git stash -u

Attention, cela supprimera définitivement vos fichiers si vous avez des entrées de répertoire / * dans votre fichier gitignore.


351
2017-07-25 15:49



Ajoutez le fichier à l'index:

git add path/to/untracked-file
git stash

L'ensemble du contenu de l'index, plus les modifications non mises à jour apportées aux fichiers existants, seront tous inclus dans la dissimulation.


55
2018-05-07 15:57



En git bash, le stockage de fichiers non-traités 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-démarqués ou non-engagés de votre espace de travail. Et vous pouvez inverser git stash en utilisant les commandes suivantes

git stash pop

Cela replace le fichier dans votre espace de travail local.

Mon expérience

J'ai dû effectuer une modification de mon fichier gitIgnore pour éviter le déplacement des fichiers .classpath et .project dans le repo distant. Je ne suis pas autorisé à déplacer ce .gitIgnore modifié dans le repo distant dès maintenant.

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

J'ai tout d'abord sélectivement ajouté mon reste des fichiers et engagé pour la mise en scène. Cependant, le push final ne peut pas être effectué à moins que les fichiers .gitIgnore modifiés et les fichiers non suivis viz. .project et .classpath ne sont pas cachés.

j'ai utilisé

 git stash 

pour mettre en cache le fichier .gitIgnore modifié.

Pour mettre en cache .classpath et le fichier .project, j'ai utilisé

git stash --include-untracked

et il a supprimé les fichiers de mon espace de travail. L'absence de ces fichiers enlève ma capacité de travailler sur mon lieu de travail dans Eclipse. J'ai continué en complétant la procédure pour pousser les fichiers engagés vers la télécommande. Une fois cela fait, j'ai utilisé

git stash pop

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


44
2017-08-28 20:46



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

git add path/to/untracked-file
git stash

Cependant, la question est également soulevée dans une autre réponse: Que faire si vous ne voulez pas vraiment ajouter le fichier? Eh bien, autant que je sache, il le faut. Et la volonté suivante NE PAS travail:

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, toutefois, vous pouvez effectivement le supprimer 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 puis vous pouvez continuer à travailler, dans le même état que vous étiez avant la git add (à savoir avec un fichier non suivi appelé path/to/untracked-file; plus tous les autres changements que vous avez pu avoir à 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

[Note: Comme mentionné dans un commentaire de @mancocapac, vous pouvez ajouter --exclude-standard au git ls-files commande (oui, git ls-files -o --exclude-standard).]

... qui pourrait également être facilement scripté - même les alias feraient (présenté dans la syntaxe zsh, ajuster au besoin) [aussi, j'ai raccourci le nom de fichier de sorte que tout se trouve sur l'écran sans défilement dans cette réponse; n'hésitez pas à 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 pourrait être meilleur 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 que vous voulez être en mesure de spécifier une cachette spécifique, plutôt que de simplement prendre le cachet supérieur. Peut-être ceci (au lieu du deuxième alias, ci-dessus) [espace blanc dépouillé pour s'adapter sans défilement; rajouter pour augmenter la lisibilité]:

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 si vous souhaitez fournir un identifiant de stockage, par ex. unstashall apply stash@{1} ou unstashall pop stash@{1}


17
2018-02-06 02:00



Sur git version 2.8.1: les travaux suivants pour moi.

Pour enregistrer des fichiers modifiés et non-suivis dans un stockage sans nom

git stash save -u

Pour enregistrer des fichiers modifiés et non-encombrés dans un cache avec un nom

git stash save -u <name_of_stash>

Vous pouvez utiliser soit pop et appliquer plus tard comme suit.

git stash pop

git stash apply stash@{0}

8
2018-02-20 09:23



J'étais capable de 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 cachette des fichiers suivis, ne laissant que les fichiers non suivis cachés.


4
2018-05-06 22:33



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

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 chemin non suivi est le seul chemin que vous êtes en train de cacher, la cachette "temp stash" sera une cachette vide. La méthode correcte consiste à ajouter le chemin entier, pas seulement le nom du répertoire (c'est-à-dire à terminer le chemin avec un '/'):

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

1
2017-08-19 23:59



Je pensais que cela pourrait être résolu en disant à git que le fichier existe, plutôt que d'en confier tout le contenu à la zone de transit, 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
2017-10-11 10:10



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)


0
2018-05-28 07:35