web-dev-qa-db-fra.com

Comment puis-je convertir mes modifications en 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?

231
Eric

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.

176
Jamie Penney

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

253
theraven

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.

154
qwertzguy

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.

53
checksum

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
44
jiahut

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
25
Sergiu Todirascu

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
6
cmcginty

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 et
  • git 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.

6
VonC

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
3
David H.

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'

0
alex_1948511