Tengo un submódulo git (RestKit) que he agregado a mi repositorio.
Cambié accidentalmente algunos archivos allí y me gustaría volver a la versión de origen. Para hacer eso, traté de correr
Mac:app-ios user$ git submodule update RestKit
Pero como puede ver aquí, esto no funcionó ya que todavía es "contenido modificado":
Mac:app-ios user$ git status
...
# modified: RestKit (modified content)
Incluso
Mac:app-ios user$ git submodule update -f RestKit
no revierte archivos modificados localmente.
¿Cómo restablezco el contenido de ese submódulo?
git
git-submodules
Eric
fuente
fuente
git reset --hard
no funciona, primero intente especificar la rama remota congit reset --hard origin/<branch_name>
.Respuestas:
Vaya al directorio del submódulo, luego realice un
git reset --hard
restablecimiento de todos los archivos modificados a su último estado confirmado. Tenga en cuenta que esto descartará todos los cambios no comprometidos.fuente
git submodule update --init
trabajó para mi; sin--init
eso no funcionó en absoluto.git submodule update -f --init
para mi caso.Si desea hacer esto para todos los submódulos, sin tener que cambiar los directorios, puede realizar
git submodule foreach git reset --hard
También puede usar el indicador recursivo para aplicar a todos los submódulos:
git submodule foreach --recursive git reset --hard
fuente
git submodule foreach --recursive git clean -x -f -d
Un método más seguro que todas las respuestas anteriores:
El primer comando "desvincula" por completo todos los submódulos, el segundo realiza un nuevo pago de ellos.
Lleva más tiempo que los otros métodos, pero funcionará independientemente del estado de sus submódulos.
fuente
error: Your local changes to the following files would be overwritten by checkout
*
en miPS1
quegit status -uno
era incapaz de explicar).Bueno para mi tener
simplemente restablezca el submódulo al estado donde se desprotegió, no es necesario para el estado / compromiso referenciado del repositorio principal. Todavía tendré "contenidos modificados" como dijo OP. Entonces, para que el submódulo vuelva a la confirmación correcta, ejecuto:
Luego, cuando lo hago
git status
, está limpio en el submódulo.fuente
submodule update --init
no parece revertir las modificaciones locales en mi caso de todos modos: |hacer 4 pasos secuenciales:
fuente
git submodule update
fue lo que me solucionó el problema(new commits)
.Esto funcionó para mí, incluso recursivamente en submódulos (quizás es por eso que su -f no funcionó, porque cambió un submódulo dentro del submódulo):
fuente
Primero intente esto, como otros han dicho:
Si eso no funciona, cambie al directorio del submódulo y use el siguiente comando para ver si hay algún cambio en el submódulo:
Si hay cambios en su submódulo, elimínelos. Verifique que no pueda ver ningún cambio cuando ejecute "git status".
Luego, regrese al repositorio principal y ejecute "git submodule update --init" nuevamente.
fuente
Desde Git 2.14 (Q3 2017), no tiene que entrar en cada submódulo para hacer un
git reset
(como engit submodule foreach git reset --hard
)Esto se debe a que git reset en sí mismo ahora sabe cómo ir recursivamente a submódulos.
Ver commit 35b96d1 (21 de abril de 2017) y commit f2d4899 , commit 823bab0 , commit cd279e2 (18 de abril de 2017) por Stefan Beller (
stefanbeller
) .(Fusionada por Junio C Hamano -
gitster
- en commit 5f074ca , 29 de mayo de 2017)git-reset
es otro manipulador de árbol en funcionamiento, que debería enseñarse sobre submódulos.Advertencia : la diferencia entre:
git reset --hard --recurse-submodule
ygit submodule foreach git reset --hard
es que el primero también restablecerá el árbol de trabajo del repositorio principal principal, ya que el segundo solo restablecerá el árbol de trabajo de submódulos.
Así que úsalo con precaución.
fuente
Para git <= 2.13, estos dos comandos combinados deberían restablecer sus repositorios con submódulos recursivos:
fuente
Esto funciona con nuestras bibliotecas que ejecutan GIT v1.7.1, donde tenemos un repositorio de paquetes DEV y un repositorio de paquetes LIVE. Los repositorios en sí mismos no son más que un shell para empaquetar los activos de un proyecto. Todos los submódulos.
LIVE nunca se actualiza intencionalmente, sin embargo, pueden ocurrir archivos de caché o accidentes, dejando el repositorio sucio. Los submódulos nuevos agregados al DEV también deben inicializarse dentro de LIVE.
Repositorio de paquetes en DEV
Aquí queremos obtener todos los cambios ascendentes que aún no conocemos, luego actualizaremos nuestro repositorio de paquetes.
Repositorio de paquetes en LIVE
Aquí queremos extraer los cambios comprometidos con el repositorio DEV, pero no los cambios ascendentes desconocidos.
fuente
Si desea descartar todos los cambios en todo el repositorio junto con los submódulos, puede usar
git restore . --recurse-submodules
Esto deshacerá todos los cambios realizados en el repositorio y en los submódulos.
fuente
mi manera de restablecer todos los submódulos (SIN separar y mantener su rama "maestra"):
submódulo git foreach 'git checkout master && git reset --hard $ sha1'
fuente