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é d'exécuter
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?
git
git-submodules
Eric
la source
la source
git reset --hard
cela ne fonctionne pas, essayez d'abord de spécifier la branche distante avecgit reset --hard origin/<branch_name>
.Réponses:
Accédez au répertoire du sous-module, puis effectuez une
git reset --hard
pour réinitialiser tous les fichiers modifiés à leur dernier état validé. N'oubliez pas que cela annulera toutes les modifications non validées.la source
git submodule update --init
travaillé pour moi; sans--init
cela ne fonctionnait pas du tout.git submodule update -f --init
pour mon cas.Si vous souhaitez 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 l'indicateur récursif pour appliquer à tous les sous-modules:
git submodule foreach --recursive git reset --hard
la source
git submodule foreach --recursive git clean -x -f -d
Une méthode plus sûre que toutes les réponses précédentes:
La première commande «dissocie» complètement tous les sous-modules, la seconde en fait 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.
la source
error: Your local changes to the following files would be overwritten by checkout
*
dans monPS1
quigit status -uno
n'a pas pu expliquer).Eh bien pour moi, ayant
il suffit de réinitialiser le sous-module à l'état dans lequel il a été extrait, pas nécessaire à l'état / commit référencé par le référentiel principal. J'aurai toujours des "contenus modifiés" comme OP l'a dit. Donc, afin de ramener le sous-module au commit correct, je lance:
Ensuite, quand je le fais
git status
, c'est propre sur le sous-module.la source
submodule update --init
ne semble malheureusement pas annuler les modifications locales dans mon cas: |faire 4 étapes séquentielles:
la source
git submodule update
été ce qui a résolu le problème(new commits)
pour moi.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):
la source
Essayez d'abord cela, comme d'autres l'ont dit:
Si cela ne fonctionne pas, accédez au répertoire du sous-module et utilisez la commande suivante pour voir s'il y a des modifications dans le sous-module:
S'il y a des changements dans votre sous-module, supprimez-les. Vérifiez que vous ne voyez aucun changement lorsque vous exécutez "git status".
Ensuite, revenez au référentiel principal et exécutez à nouveau "git submodule update --init".
la source
Depuis Git 2.14 (Q3 2017), vous n'avez pas besoin d'aller dans chaque sous-module pour faire un
git reset
(comme dansgit submodule foreach git reset --hard
)C'est parce que git reset lui-même sait maintenant comment rentrer récursivement dans les sous-modules.
Voir commit 35b96d1 (21 avril 2017) et commit f2d4899 , commit 823bab0 , commit cd279e2 (18 avr 2017) par Stefan Beller (
stefanbeller
) .(Fusionné par Junio C Hamano -
gitster
- en commit 5f074ca , 29 mai 2017)git-reset
est encore un autre manipulateur d'arbre de travail, qui devrait être enseigné sur les sous-modules.Attention : la différence entre:
git reset --hard --recurse-submodule
etgit submodule foreach git reset --hard
est que le premier réinitialisera également votre arborescence de travail du référentiel parent principal, car le dernier ne réinitialiserait que l'arborescence de travail des sous-modules.
Utilisez donc avec prudence.
la source
Pour git <= 2.13, ces deux commandes combinées devraient réinitialiser votre repos avec des sous-modules récursifs:
la source
Cela fonctionne avec nos bibliothèques exécutant GIT v1.7.1, où nous avons un référentiel de packages DEV et un référentiel de packages 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 dépôt 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 extraire toutes les modifications en amont dont nous ne sommes pas encore au courant, puis nous mettrons à jour notre référentiel de packages.
Référentiel de packages en LIVE
Ici, nous voulons extraire les modifications qui sont validées dans le référentiel DEV, mais pas les modifications en amont inconnues.
la source
Si vous souhaitez ignorer toutes les modifications dans l'ensemble du référentiel avec les sous-modules, vous pouvez utiliser
git restore . --recurse-submodules
Cela annulera toutes les modifications apportées au référentiel et aux sous-modules.
la source
ma façon de réinitialiser tous les sous-modules (SANS détacher et garder leur branche "master"):
git submodule foreach 'git checkout master && git reset --hard $ sha1'
la source