repositorio - git push example
¿Cómo reverso mis cambios a un submódulo de git? (10)
Bueno para mí, teniendo
git reset --hard
simplemente restaure el submódulo al estado donde se desprotegió, no necesario para el compromiso / estado repo referido del principal. Todavía tendré "contenidos modificados" como dijo OP. Entonces, para que el submódulo regrese a la confirmación de corrección, ejecuto:
git submodule update --init
Entonces cuando hago el git status
, está limpio en el submódulo.
Tengo un submódulo de git (RestKit) que he agregado a mi repositorio.
Accidentalmente cambié algunos archivos y me gustaría volver a la versión original. 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 los archivos modificados localmente
¿Cómo reinicio el contenido de ese submódulo?
Desde Git 2.14 (Q3 2017), no tienes que entrar en cada submódulo para hacer un git reset
(como en el git submodule foreach git reset --hard
)
Esto se debe a que el reinicio de git ahora sabe cómo acceder recursivamente a los submódulos.
Consulte la confirmación 35b96d1 (21 de abril de 2017) y confirme 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)
builtin / reset: add --recurse-submodules switch
git-reset
es otro manipulador de árbol de trabajo, que debería enseñarse sobre los submódulos.
Cuando un usuario usa git-reset y solicita que se repita en submódulos, esto restablecerá los submódulos al nombre del objeto tal como se grabó en el superproyecto, separando los HEAD.
Advertencia : la diferencia entre:
-
git reset --hard --recurse-submodule
y -
git submodule foreach git reset --hard
es que el primero también reiniciará el árbol de trabajo principal del repositorio padre, ya que este último solo restablecería el árbol de trabajo de los submódulos.
Entonces use con precaución.
Esto funcionó para mí, incluso recursivamente en submódulos (quizás por eso tu -f no funcionó, porque cambiaste un submódulo dentro del submódulo):
git submodule update -f --recursive
Esto funciona con nuestras bibliotecas ejecutando 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 caparazón para empaquetar los activos para un proyecto. todos los submódulos
El LIVE nunca se actualiza intencionalmente, sin embargo, pueden producirse archivos de caché o accidentes, dejando el repositorio sucio. Los nuevos submódulos añadidos al DEV también deben inicializarse dentro de LIVE.
Repositorio de paquetes en DEV
Aquí queremos extraer todos los cambios preliminares que aún no conocemos, luego actualizaremos nuestro repositorio de paquetes.
# Recursively reset to the last HEAD
git submodule foreach --recursive git reset --hard
# Recursively cleanup all files and directories
git submodule foreach --recursive git clean -fd
# Recursively pull the upstream master
git submodule foreach --recursive git pull origin master
# Add / Commit / Push all updates to the package repo
git add .
git commit -m "Updates submodules"
git push
Paquete de repositorio en VIVO
Aquí queremos extraer los cambios que están comprometidos con el repositorio DEV, pero no cambios desconocidos aguas arriba.
# Pull changes
git pull
# Pull status (this is required for the submodule update to work)
git status
# Initialize / Update
git submodule update --init --recursive
Para git <= 2.13, estos dos comandos combinados deben restablecer sus repositorios con submódulos recursivos:
git submodule foreach --recursive git reset --hard
git submodule update --recursive --init
Si desea hacer esto para todos los submódulos, sin tener que cambiar 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
Un método más seguro a prueba de fallas que todas las respuestas anteriores:
git submodule deinit -f .
git submodule update --init
El primer comando "desenlaza" por completo todos los submódulos, el segundo realiza una nueva comprobación de ellos.
Lleva más tiempo que los otros métodos, pero funcionará independientemente del estado de sus submódulos.
Vaya al directorio del submódulo, luego haga un git reset --hard
para restablecer todos los archivos modificados a su último estado comprometido. Tenga en cuenta que esto descartará todos los cambios no comprometidos.
hacer 4 pasos secuenciales:
git submodule foreach git reset --hard HEAD
git submodule update
git submodule foreach "git checkout master; git pull"
git submodule foreach git clean -f
mi manera de restablecer todos los submódulos (SIN separar y mantener su rama "maestra"):
git submodule foreach ''git checkout master && git reset --hard $ sha1''