Como você esconder um arquivo untracked?
Pergunta
Eu tenho alterações em um arquivo, além de um novo arquivo, e gostaria de usar git stash para guardá-los enquanto eu mudar para outra tarefa. Mas git stash por si só esconde apenas as alterações no arquivo existente; o novo arquivo permanece em minha árvore de trabalho, atravancando o meu futuro trabalho. Como posso guardar esse arquivo untracked?
Solução
Atualização de 17 maio de 2018:
Novas versões do git agora têm git stash --all
que esconde todos os arquivos, incluindo arquivos untracked e ignorados.
git stash --include-untracked
há toques mais longos arquivos ignorados (testados em git 2.16.2).
resposta original abaixo:
A partir da versão 1.7.7 você pode usar git stash --include-untracked
ou git stash save -u
para esconder arquivos untracked sem preparo-los.
Add (git add
) o arquivo e começar a segui-lo. Então esconder. Uma vez que todo o conteúdo do arquivo são novos, eles serão escondidos, e você pode manipulá-lo conforme necessário.
Outras dicas
A partir de git 1.7.7, git stash
aceita a opção --include-untracked
(ou -u
de curto mão). Para incluir arquivos untracked em seu esconderijo, use um dos seguintes comandos:
git stash --include-untracked
git stash -u
Adicionar o arquivo para o índice:
git add path/to/untracked-file
git stash
Todo o conteúdo do índice, além de quaisquer alterações unstaged para arquivos existentes, tudo vai fazê-lo no esconderijo.
No bash git, stashing de arquivos untracked é conseguido usando o comando
git stash --include-untracked
ou
git stash -u
http://git-scm.com/docs/git-stash
git stash de remove qualquer arquivos untracked ou uncommited de seu espaço de trabalho. E você pode reverter git stash usando seguintes comandos
git stash pop
Isto irá colocar a parte de trás do arquivo no seu espaço de trabalho local.
Minha experiência
Eu tive que fazer uma modificação para o meu arquivo gitignore ao movimento evitar de .classpath e .project em repo remoto. Eu não estou autorizado a mover este .gitignore modificado no repo remoto a partir de agora.
.classpath e .project são importantes para eclipse - que é o meu editor java
.I primeiro lugar seletivamente adicionei meu resto dos arquivos e comprometido para o estadiamento. No entanto, empurrão final não pode ser realizada a menos que os fiels .gitignore modificados e dos arquivos untracked viz. .project e .classpath não estão escondidos.
Eu costumava
git stash
para stashing o arquivo .gitignore modificado.
Para stashing .classpath e arquivo .project, eu usei
git stash --include-untracked
e removido os arquivos do meu espaço de trabalho. Ausência desses arquivos tira a minha capacidade de trabalhar no meu local de trabalho no eclipse. Eu continuei com a conclusão do procedimento para empurrar os arquivos comprometidos com remoto. Uma vez que isso foi feito com sucesso, eu usei
git stash pop
Esta colado os mesmos arquivos de volta na minha área de trabalho. Isso deu volta para mim a minha capacidade de trabalho no mesmo projeto no eclipse. Espero que isso afasta equívocos.
Como já foi dito em outros lugares, a resposta é git add
o arquivo. por exemplo:.
git add path/to/untracked-file
git stash
No entanto, a questão é também levantada em outra resposta: E se você realmente não deseja adicionar o arquivo? Bem, tanto quanto eu posso dizer, você tem que. E a seguir irá não trabalho:
git add -N path/to/untracked/file # note: -N is short for --intent-to-add
git stash
este irá falhar, como se segue:
path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state
Então, o que você pode fazer? Bem, você tem que adicionar realmente o arquivo, no entanto , você pode efetivamente un-adicioná-lo mais tarde, com 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
E então você pode continuar a trabalhar, no mesmo estado em que estava antes de o git add
. (Ou seja, com um arquivo untracked chamado path/to/untracked-file
; além de quaisquer outras alterações que possa ter tido a arquivos rastreados)
Outra possibilidade para um fluxo de trabalho sobre isso seria algo como:
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
[Nota: Como mencionado em um comentário de @mancocapac, você pode querer adicionar --exclude-standard
ao comando git ls-files
(assim, git ls-files -o --exclude-standard
).]
... que também poderia ser facilmente o script - até mesmo aliases faria (apresentada na sintaxe zsh; ajustar conforme necessário) [também, eu encurtado o nome do arquivo para que tudo se encaixa na tela sem rolagem nesta resposta; fique à vontade para substituir um nome alternativo de sua escolha]:
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'
Note que este último pode ser melhor como um script ou função shell, para permitir que os parâmetros a serem fornecidos para git stash
, no caso de você não quer pop
mas apply
, e / ou quer ser capaz de especificar um estoque específico, ao invés de apenas tomar o topo. Talvez este (em vez do segundo aliás, acima) [espaços em branco retirados para se ajustar sem rolagem; re-add para aumentar a legibilidade]:
function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}
Nota ??em> : Neste formulário, você precisa fornecer um argumento acção, bem como o identificador se você estiver indo para fornecer um identificador stash, por exemplo, unstashall apply stash@{1}
ou unstashall pop stash@{1}
O que é claro que você colocar na sua .zshrc
ou equivalente para fazer existir a longo prazo.
Esperemos que esta resposta é útil para alguém, colocar tudo junto em um só resposta.
Na versão 2.8.1 git:. Seguindo obras para mim
Para salvar arquivos modificados e untracked em estoque sem um nome
git stash save -u
Para salvar arquivos modificados e untracked em esconderijo com um nome
git stash save -u <name_of_stash>
Você pode usar tanto pop e aplicar mais tarde como segue.
git stash pop
git stash apply stash@{0}
Eu era capaz de esconder apenas os arquivos untracked fazendo:
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}
O último aparece o esconderijo dos arquivos rastreados, deixando apenas os arquivos untracked escondido.
Se você quiser esconder arquivos untracked, mas manter os arquivos indexados (aqueles que você está prestes a cometer, por exemplo), basta adicionar -k
(índice de sustento) opção para o -u
git stash -u -k
Você pode simplesmente fazê-lo com o comando abaixo
git stash save --include-untracked
ou
git stash save -u
Para saber mais sobre git stash de visite este post (clique aqui)
vamos supor que o arquivo novo e untracked é chamado: "views.json". se você quer mudar ramo por stashing o estado do seu aplicativo, eu geralmente digite:
git add views.json
Depois:
git stash
E seria escondido. Então eu só posso mudar ramo com
git checkout other-nice-branch
Existem várias respostas corretas aqui, mas eu queria salientar que para os novos diretórios inteiros, 'git add path'
não trabalho. Então se você tem um monte de novos arquivos em untracked-path e faça o seguinte:
git add untracked-path
git stash "temp stash"
isso irá esconder com a seguinte mensagem:
Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty
e se untracked-path é o único caminho que você está stashing, o esconderijo "temp estoque" será um esconderijo vazio. maneira correta é adicionar o caminho inteiro, e não apenas o nome do diretório (ou seja, acabar com o caminho com uma '/'):
git add untracked-path/
git stash "temp stash"
Eu pensei que isso poderia ser resolvido, dizendo git que o arquivo existe, ao invés de cometer todo o conteúdo de TI para a área de teste, e em seguida, chamar git stash
. Araqnid descreve como fazer o primeiro.
git add --intent-to-add path/to/untracked-file
ou
git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file
No entanto, este último não funciona:
$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state
Eu costumava ponderar e desejo o mesmo recurso. Mas com o tempo, percebi que realmente não é necessário. Quando você esconder, não há problema em deixar os novos arquivos. Nada "ruim" pode acontecer com eles (quando você verificar outra coisa, git vai erro e não substituir o arquivo untracked existente)
E já que normalmente o período de tempo entre a git stash
eo git stash pop
é bastante pequena, você vai precisar do arquivo untracked rapidamente novamente.
Então, eu diria a inconveniência do arquivo aparecer em git status
enquanto você está trabalhando em outra coisa (entre a git stash
eo git stash pop
) é menor, então o inconveniente causado pelo trabalho e precisava de atenção que, de outra forma custar para tentar adicionar o arquivo untracked ao seu esconderijo.