1761 votes

Comment avez-vous gardez un sans traces de fichier?

J'ai des modifications à un fichier, en plus d'un nouveau fichier, et que vous souhaitez utiliser git stash pour les mettre à l'écart alors que je passe à une autre tâche. Mais git stash par lui-même caches seules les modifications apportées au fichier existant; le nouveau fichier reste dans mon arbre de travail, d'encombrer mon travail futur. Comment dois-je ranger ce sans traces de fichier?

2442voto

sykora Points 30290

Ajouter (git addle fichier et commencer le suivi. Puis les ranger. Depuis la totalité du contenu du fichier sont nouveaux, ils seront planqué, et vous pouvez le manipuler comme nécessaire.

À partir de la version 1.7.7 vous pouvez utiliser git stash -u de ranger sans traces de fichiers sans mise en scène.

Avertissement, ceci vous permettra de supprimer définitivement vos fichiers si vous avez n'importe quel répertoire/* les entrées dans votre fichier gitignore.

441voto

John Kary Points 2020

Comme de git 1.7.7, git stash accepte l' --include-untracked option (ou à court de main -u). Pour inclure non chaînée des fichiers dans votre cachette, utilisez l'une des commandes suivantes:

git stash --include-untracked
git stash -u

Avertissement, ceci vous permettra de supprimer définitivement vos fichiers si vous avez n'importe quel répertoire/* les entrées dans votre fichier gitignore.

85voto

skiphoppy Points 16563

Ajouter le fichier à l'index:

git add path/to/untracked-file
git stash

L'intégralité du contenu de l'index, en plus de toute unstaged des changements à des fichiers existants, seront tous dans la cachette.

20voto

lindes Points 2402

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 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 peux dire, vous avez pour. Et la suite va PAS travailler:

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

ce sera un échec, 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 avez vraiment ajouter le fichier, cependant, vous pouvez effectivement des nations unies-l'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 puis, vous pouvez continuer à travailler, dans le même état que vous avez été avant l' git add (c'est à dire avec un sans traces fichier appelé path/to/untracked-file; en plus de toutes les autres modifications que vous pourriez avoir eu à dossiers).

Une autre possibilité pour un flux de travail sur ce 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

... qui pourrait aussi être facilement script-même alias le ferait (présenté dans zsh la syntaxe; les ajuster au besoin) [aussi, j'ai raccourci le nom de fichier de sorte qu'il s'adapte à tous sur l'écran sans défilement dans cette réponse, n'hésitez pas à remplacer 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'

A noter que ce dernier peut-être mieux comme un shell script ou de la fonction, afin de permettre les paramètres devant être fournis à l' git stash, dans le cas où vous ne voulez pas pop mais apply, et/ou si vous voulez être en mesure de préciser une cachette, plutôt que de simplement prendre le dessus. Peut-être cela (au lieu de la deuxième alias, ci-dessus) [espace dépouillé de sans défilement; ajouter de nouveau 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'identifiant si vous allez à fournir une cachette identificateur, par exemple, unstashall apply stash@{1} ou unstashall pop stash@{1}

Qui, bien sûr, vous mettriez dans votre .zshrc ou l'équivalent, pour faire exister à long terme.

J'espère que cette réponse est utile à quelqu'un, de tout mettre ensemble dans une seule réponse.

1voto

DrStrangepork Points 108

Il y a plusieurs bonnes réponses ici, mais je tenais à préciser que pour les nouveaux répertoires entiers, 'git add path' aura PAS de travail. Donc, si vous avez un tas de nouveaux fichiers sans traces de chemin et de faire cela:

git add untracked-path
git stash "temp stash"

cela permettra de ranger 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 non chaînée-chemin d'accès est le seul chemin que vous êtes en cachant, la cachette "temp stash" sera vide cachette. Bonne façon est d'ajouter le chemin d'accès complet, et pas seulement le nom du répertoire (c'est à dire en fin de chemin avec un '/'):

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X