O git adiciona apenas alterações modificadas e ignora arquivos não rastreados

658

Eu executei o "status do git" e listados abaixo estão alguns arquivos que foram modificados / ou sob o título "alterações não preparadas para confirmação". Ele também listou alguns arquivos não rastreados que eu quero ignorar (eu tenho um arquivo ".gitignore" nesses diretórios).

Quero colocar os arquivos modificados na preparação para que eu possa confirmar. Quando executei o "git add.", Foram adicionados os arquivos modificados E os arquivos que quero ignorar na preparação.

Como adiciono apenas os arquivos modificados e ignoro os arquivos não rastreados, se apresentados com o status git abaixo.

Além disso, meus arquivos ".gitignore" estão funcionando corretamente?

$ git status
# On branch addLocation
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   someProject/path/domain/viewer/LocationDO.java
#       modified:   someProject/path/service/ld/LdService.java
#       modified:   someProject/path/service/ld/LdServiceImpl.java
#       modified:   someProject/path/web/jsf/viewer/LocationFormAction.java
#       modified:   someProject/war/WEB-INF/classes/message/viewer/viewer.properties
#       modified:   someProject/war/page/viewer/searchForm.xhtml
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .metadata/
#       someProject/build/
no changes added to commit (use "git add" and/or "git commit -a")
Steve
fonte
1
se você adicionou o arquivo .gitignore DEPOIS de rastrear os arquivos, o arquivo .gitignore não ignorará os arquivos que já estão sendo rastreados. isso pode ser um problema.
BKSpurgeon

Respostas:

904

Idealmente, você .gitignoredeve impedir que os arquivos não rastreados (e ignorados) sejam mostrados no status, adicionados usando git addetc. Então, peço que você corrija o seu.gitignore

Você pode fazer git add -uisso para preparar os arquivos modificados e excluídos.

Você também pode fazer git commit -apara confirmar apenas os arquivos modificados e excluídos.

Observe que se você tem o Git da versão anterior à 2.0 e é usado git add ., precisará usá-lo git add -u .(consulte " Diferença de" git add -A"e" git add ." ").

manojlds
fonte
74
ponto de interesse, este ( add -u) não adiciona apenas modified arquivos, mas também "adiciona" arquivos deleted.. algo que atualmente estou tentando impedir.
procurando
6
Para adicionar apenas arquivos modificados, geralmente eu vou para o diretório superior do repositório e digito for fil in $(git diff --name-only --relative); do git add $fil; done. Se eu fosse usá-lo muito (não uso), faria apenas um alias para isso no meu ~/.bashrcarquivo. Obviamente, isso funciona apenas no bash.
Krøllebølle
8
Nenhuma resposta definitiva, apenas respostas "funciona para a maioria das pessoas"? Eu tenho que usar outro processo para fazer isso corretamente? Como isso não está embutido no git add? Parece uma coisa tão comum querer fazer.
Samuel
2
Os métodos mencionados nesses comentários falharão se você tiver nomes de arquivos ímpares (espaços, asteriscos, quais não). Para escapar adequadamente de arquivos com nomes estranhos, use:IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
Orwellophile
3
git add -ué curto para git add --updatee git commit -aé curto paragit commit --all
Hugo
96

Isso funcionou para mim:

#!/bin/bash

git add `git status | grep modified | sed 's/\(.*modified:\s*\)//'`

Ou melhor ainda:

$ git ls-files --modified | xargs git add
user877329
fonte
Você não precisa agrupar (()) se não quiser reutilizar o grupo e deixar um espaço em branco na frente do nome do arquivo para mim. Não que isso afete o resultado final nesse caso, mas para dar um exemplo, aqui está o comando sed que eu usei: sed 's /.* modified: * //'. Verificado no Mac OS X 10.9.5.
Samuel
O agrupamento @Samuel é bom ao testar a expressão. Então eu posso imprimir a correspondência entre colchetes para ver se estou certa.
user877329
1
@ Sua solução adiciona arquivos modificados e não rastreados e é igual a git add -u, portanto, não responde à pergunta.
22815 Nick Volynkin
7
--modified parece incluir deletado e apenas modificado
DMart
2
git diff-files -z --diff-filter = M - somente nome | xargs -0 git add --dry-run parece funcionar bem.
precisa saber é o seguinte
10
git commit -a -m "message"

-a: inclui todos os arquivos alterados / excluídos atualmente neste commit. No entanto, lembre-se de que os arquivos (novos) não rastreados não estão incluídos.

-m: define a mensagem do commit

Saurabh
fonte
4

Você não disse qual é o seu atualmente .gitignore, mas um .gitignorecom o seguinte conteúdo no diretório raiz deve fazer o truque.

.metadata
build
Karl Bielefeldt
fonte
3
Eu estava usando meu .gitignore tudo errado. Eu tinha um arquivo .gitignore vazio em todos os diretórios que desejava ignorar, em vez de ter um único gitignore com o conteúdo.
Steve
1
@ Steve: Isso funcionaria se cada um. gitognorecontinha um começo (ignore tudo). Mas um único .gitignoreno diretório superior geralmente é muito mais simples de usar e basta.
Maaartinus
2

Por acaso tentei isso para que eu pudesse ver a lista de arquivos primeiro:

git status | grep "modified:" | awk '{print "git add  " $2}' > file.sh

cat ./file.sh

executar:

chmod a+x file.sh
./file.sh 

Editar: (ver comentários) Isso pode ser alcançado em uma etapa:

git status | grep "modified:" | awk '{print $2}' | xargs git add && git status
Mike Q
fonte
1
Isso poderia ser alcançado em uma etapa:git status | grep modified | awk '{print $2}' | xargs git add && git status
Choylton B. Higginbottom 27/17/17
Sim, eu deveria ter fornecido essa solução também, obrigado, atualizei o post.
Mike Q
1

Não tenho certeza se esse é um recurso ou um bug, mas isso funcionou para nós:

git commit '' -m "Message"

Observe a lista de arquivos vazia ''. O Git interpreta isso para confirmar todos os arquivos rastreados modificados, mesmo que eles não sejam testados, e ignorar os arquivos não rastreados.

Erik Englund
fonte
Definitivamente, isso não funciona ao usar --amend.
GhostCat 5/04/19
1

Para preparar arquivos modificados e excluídos

git add -u

Dayamoy
fonte