Comment puis-je rétablir mes modifications dans un sous-module git?

J’ai un sous-module git (RestKit) que j’ai ajouté à mon repo.

J’ai accidentellement changé certains fichiers et j’aimerais revenir à la version source. Pour ce faire, j’ai essayé de courir

Mac:app-ios user$ git submodule update RestKit 

Mais comme vous pouvez le voir ici, cela n’a pas fonctionné car il s’agit toujours de “contenu modifié”:

 Mac:app-ios user$ git status ... # modified: RestKit (modified content) 

Même

 Mac:app-ios user$ git submodule update -f RestKit 

ne rétablit pas les fichiers modifiés localement.
Comment réinitialiser le contenu de ce sous-module?

Déplacez-vous dans le répertoire du sous-module, puis effectuez un git reset --hard pour réinitialiser tous les fichiers modifiés à leur dernier état git reset --hard . Sachez que cela supprimera toutes les modifications non validées.

Si vous voulez faire cela pour tous les sous-modules, sans avoir à changer de répertoire, vous pouvez effectuer

git submodule foreach git reset --hard

Vous pouvez également utiliser l’indicateur récursif pour appliquer à tous les sous-modules:

git submodule foreach --recursive git reset --hard

Une méthode plus sûre que toutes les réponses précédentes:

 git submodule deinit -f . git submodule update --init 

La première commande “détache” complètement tous les sous-modules, la seconde effectue ensuite une nouvelle vérification.
Cela prend plus de temps que les autres méthodes, mais fonctionnera quel que soit l’état de vos sous-modules.

Bien pour moi, avoir

 git reset --hard 

Il suffit de réinitialiser le sous-module à l’état où il a été extrait, ce qui n’est pas nécessaire pour le commit / état référencé du référentiel principal. J’aurai toujours des “contenus modifiés” comme l’a dit OP. Donc, pour ramener le sous-module à la validation correcte, je lance:

 git submodule update --init 

Ensuite, quand je suis en git status , il est propre sur le sous-module.

faire 4 étapes séquentielles:

 git submodule foreach git reset --hard HEAD git submodule update git submodule foreach "git checkout master; git pull" git submodule foreach git clean -f 

Cela a fonctionné pour moi, y compris récursivement dans des sous-modules (peut-être que votre -f n’a pas fonctionné, car vous avez changé un sous-module à l’intérieur du sous-module):

 git submodule update -f --recursive 

Depuis Git 2.14 (Q3 2017), vous n’avez pas à entrer dans chaque sous-module pour effectuer une git reset (comme dans git submodule foreach git reset --hard )

C’est parce que Git Reset lui-même sait maintenant comment entrer récursivement dans les sous-modules.

Voir commit 35b96d1 (21 avril 2017), et commettre f2d4899 , commettre 823bab0 , commettre cd279e2 (18 avril 2017) par Stefan Beller ( stefanbeller ) .
(Fusion par Junio ​​C Hamano – gitster – dans commit 5f074ca , 29 mai 2017)

intégré / réinitialiser: append le commutateur –recurse-submodules

git-reset est un autre manipulateur d’arbre de travail qui devrait être enseigné sur les sous-modules.

Lorsqu’un utilisateur utilise git-reset et demande à se réincorporer dans des sous-modules, les sous-modules sont réinitialisés au nom de l’object, tel qu’il est enregistré dans le superprojet, en détachant les HEAD.

Attention : la différence entre:

  • git reset --hard --recurse-submodule et
  • git submodule foreach git reset --hard

est que le premier réinitialisera également l’arbre de travail principal du repo parent, car ce dernier ne réinitialiserait que l’arbre de travail des sous-modules.
Donc, utilisez avec prudence.

Pour git < = 2.13, ces deux commandes combinées doivent réinitialiser vos repos avec des sous-modules récursifs:

 git submodule foreach --recursive git reset --hard git submodule update --recursive --init 

Cela fonctionne avec nos bibliothèques exécutant GIT v1.7.1, où nous avons un repo de package DEV et un repo de package LIVE. Les référentiels eux-mêmes ne sont rien d’autre qu’un shell pour regrouper les actifs d’un projet. tous les sous-modules.

Le LIVE n’est jamais mis à jour intentionnellement, cependant des fichiers de cache ou des accidents peuvent se produire, laissant le repo sale. Les nouveaux sous-modules ajoutés au DEV doivent également être initialisés dans LIVE.

Référentiel de packages dans DEV

Ici, nous voulons tirer toutes les modifications en amont dont nous ne sums pas encore au courant, puis nous mettrons à jour notre référentiel de paquets.

 # 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 

Référentiel de packages dans LIVE

Ici, nous voulons extraire les modifications qui sont validées dans le référentiel DEV, mais pas les modifications en amont inconnues.

 # Pull changes git pull # Pull status (this is required for the submodule update to work) git status # Initialize / Update git submodule update --init --recursive 

ma façon de réinitialiser tous les sous-modules (sans détacher et conserver leur twig “maître”):

git submodule foreach ‘git checkout master && git reset –hard $ sha1’