Eu tenho um submódulo git (RestKit) que eu adicionei ao meu repositório.
Alterei acidentalmente alguns arquivos e gostaria de voltar à versão original. Para fazer isso, tentei executar
Mac:app-ios user$ git submodule update RestKit
Mas como você pode ver aqui, isso não funcionou, pois ainda é "conteúdo modificado":
Mac:app-ios user$ git status
...
# modified: RestKit (modified content)
Até
Mac:app-ios user$ git submodule update -f RestKit
não reverte arquivos modificados localmente.
Como redefinir o conteúdo desse submódulo?
git
git-submodules
Eric
fonte
fonte
git reset --hard
não funcionar, tente primeiro especificar a ramificação remota comgit reset --hard origin/<branch_name>
.Respostas:
Mova para o diretório do submódulo e faça um
git reset --hard
para redefinir todos os arquivos modificados para o último estado confirmado. Esteja ciente de que isso descartará todas as alterações não confirmadas.fonte
git submodule update --init
trabalhou para mim; sem--init
isso não funcionou.git submodule update -f --init
no meu caso.Se você quiser fazer isso para todos os submódulos, sem precisar alterar os diretórios, poderá executar
git submodule foreach git reset --hard
Você também pode usar o sinalizador recursivo para aplicar a todos os submódulos:
git submodule foreach --recursive git reset --hard
fonte
git submodule foreach --recursive git clean -x -f -d
Um método mais à prova de falhas do que todas as respostas anteriores:
O primeiro comando "desata" completamente todos os submódulos, o segundo faz uma nova verificação deles.
Leva mais tempo que os outros métodos, mas funcionará independentemente do estado dos seus submódulos.
fonte
error: Your local changes to the following files would be overwritten by checkout
*
em meuPS1
quegit status -uno
foi incapaz de explicar).Bem para mim, tendo
basta redefinir o submódulo para o estado em que efetuou o check-out, desnecessário ao commit / state referenciado pelo repositório principal. Ainda terei "conteúdo modificado", como disse o OP. Portanto, para obter o submódulo de volta ao commit correto, execute:
Então, quando eu faço
git status
, fica limpo no submódulo.fonte
submodule update --init
não parece reverter modificações locais no meu caso de qualquer maneira: |faça 4 etapas sequenciais:
fonte
git submodule update
foi o que corrigiu o problema(new commits)
para mim.Isso funcionou para mim, incluindo recursivamente em submódulos (talvez seja por isso que seu -f não funcionou, porque você alterou um submódulo dentro do submódulo):
fonte
Primeiro tente isso, como outros já disseram:
Se isso não funcionar, mude para o diretório do submódulo e use o seguinte comando para verificar se há alguma alteração no submódulo:
Se houver alterações no seu submódulo, livre-se delas. Verifique se você não vê nenhuma alteração ao executar o "status git".
Em seguida, volte ao repositório principal e execute "git submodule update --init" novamente.
fonte
Desde o Git 2.14 (terceiro trimestre de 2017), você não precisa entrar em cada submódulo para fazer um
git reset
(como emgit submodule foreach git reset --hard
)Isso ocorre porque o próprio git reset agora sabe como recursivamente entrar nos submódulos.
Consulte commit 35b96d1 (21 de abril de 2017) e commit f2d4899 , commit 823bab0 , commit cd279e2 (18 de abril de 2017) por Stefan Beller (
stefanbeller
) .(Mesclado por Junio C Hamano -
gitster
- na commit 5f074ca , 29 de maio de 2017)git-reset
é mais um manipulador de árvore de trabalho, que deve ser ensinado sobre submódulos.Atenção : a diferença entre:
git reset --hard --recurse-submodule
egit submodule foreach git reset --hard
é que o primeiro também redefinirá sua árvore de trabalho principal do repositório pai, pois o último redefiniria apenas a árvore de trabalho dos submódulos.
Portanto, use com cuidado.
fonte
Para git <= 2.13, esses dois comandos combinados devem redefinir seus repositórios com submódulos recursivos:
fonte
Isso funciona com nossas bibliotecas executando o GIT v1.7.1, onde temos um repositório de pacotes DEV e um repositório de pacotes LIVE. Os próprios repositórios nada mais são que um shell para empacotar os ativos de um projeto. todos os submódulos.
O LIVE nunca é atualizado intencionalmente, no entanto, arquivos em cache ou acidentes podem ocorrer, deixando o repositório sujo. Novos submódulos adicionados ao DEV também devem ser inicializados no LIVE.
Repositório de Pacotes no DEV
Aqui queremos extrair todas as alterações que ainda não estamos cientes, e atualizaremos nosso repositório de pacotes.
Repositório de Pacotes no LIVE
Aqui, queremos extrair as alterações confirmadas no repositório DEV, mas não as alterações iniciais desconhecidas.
fonte
Se você deseja descartar todas as alterações em todo o repositório, juntamente com os submódulos, você pode usar
git restore . --recurse-submodules
Isso desfará todas as alterações feitas no repositório e nos submódulos.
fonte
minha maneira de redefinir todos os submódulos (SEM desanexar e manter sua ramificação "principal"):
submodule git foreach 'mestre do checkout do git && git reset --hard $ sha1'
fonte