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 validé. Sachez que cela annulera toutes les modifications non validées.
Si vous voulez le faire pour tous les sous-modules, sans avoir à changer de répertoire, vous pouvez effectuer
git submodule foreach git reset --hard
Vous pouvez également utiliser le drapeau récursif pour appliquer à tous les sous-modules:
git submodule foreach --recursive git reset --hard
Une méthode plus sécurisée que toutes les réponses précédentes:
git submodule deinit -f .
git submodule update --init
La première commande "supprime complètement" tous les sous-modules, la seconde en effectue un nouveau contrôle.
Cela prend plus de temps que les autres méthodes, mais fonctionnera quel que soit l'état de vos sous-modules.
Bien pour moi, ayant
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/state référencé du référentiel principal. Je vais toujours avoir "contenu modifié" comme dit OP. Donc, afin de ramener le sous-module à la validation correcte, je lance:
git submodule update --init
Puis, quand je fais git status
, le sous-module est propre.
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 les sous-modules (c'est peut-être pourquoi votre -f n'a pas fonctionné, car vous avez changé un sous-module à l'intérieur du sous-module):
git submodule update -f --recursive
Pour git <= 2.13, ces deux commandes combinées doivent réinitialiser votre dépôt avec des sous-modules récursifs:
git submodule foreach --recursive git reset --hard
git submodule update --recursive --init
Depuis Git 2.14 (Q3 2017), vous n'avez pas besoin d'entrer dans chaque sous-module pour faire un git reset
(comme dans git submodule foreach git reset --hard
)
C’est parce que git reset lui-même sait maintenant comment aller récursivement dans les sous-modules.
Voir commit 35b96d1 (21 avril 2017), et commit f2d4899 , commit 823bab , commit cd279e2 (18 avril 2017 ) par Stefan Beller (stefanbeller
) .
(Fusionnée par Junio C Hamano - gitster
- dans commit 5f074ca , 29 mai 2017)
builtin/reset: ajoute un commutateur --recurse-submodules
git-reset
est encore un autre manipulateur d'arbre de travail, qui devrait être enseigné sur les sous-modules.
Lorsqu'un utilisateur utilise git-reset et demande à rentrer dans les sous-modules, les sous-modules sont réinitialisés sur le nom de l'objet tel qu'il est enregistré dans le superprojet, ce qui détache les HEAD.
Avertissement : différence entre:
git reset --hard --recurse-submodule
etgit submodule foreach git reset --hard
est que le premier réinitialisera également l’arbre de travail de votre référent parent principal, car le second ne réinitialisera que l’arbre de travail des sous-modules.
Alors utilisez avec prudence.
Cela fonctionne avec nos bibliothèques exécutant GIT v1.7.1, où nous avons un référentiel de package DEV et un référentiel de package LIVE. Les référentiels eux-mêmes ne sont 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 en cache ou des accidents peuvent se produire, laissant le dépôt sale. Les nouveaux sous-modules ajoutés au DEV doivent également être initialisés dans LIVE.
référentiel de paquet dans DEV
Ici, nous voulons extraire toutes les modifications en amont dont nous ne sommes 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 paquet dans LIVE
Ici, nous voulons extraire les modifications 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 garder leur branche "maître"):
sous-module git foreach 'git checkout master && git reset --hard $ sha1'