Ответ 1
Переместитесь в каталог подмодулей, затем сделайте git reset --hard
to reset все измененные файлы в их последнее состояние. Имейте в виду, что это отбросит все непреднамеренные изменения.
У меня есть подмодуль git (RestKit), который я добавил в свое репо.
Я случайно изменил некоторые файлы там, и я хотел бы вернуться к исходной версии. Для этого я попытался запустить
Mac:app-ios user$ git submodule update RestKit
Но, как вы можете видеть здесь, это не сработало, так как это все еще "измененный контент":
Mac:app-ios user$ git status
...
# modified: RestKit (modified content)
Даже
Mac:app-ios user$ git submodule update -f RestKit
не возвращает локально измененные файлы.
Как я reset содержимое этого подмодуля?
Переместитесь в каталог подмодулей, затем сделайте git reset --hard
to reset все измененные файлы в их последнее состояние. Имейте в виду, что это отбросит все непреднамеренные изменения.
Если вы хотите сделать это для всех подмодулей, без необходимости менять каталоги, вы можете выполнить
git submodule foreach git reset --hard
Вы также можете использовать рекурсивный флаг для применения ко всем подмодулям:
git submodule foreach --recursive git reset --hard
Более безопасный метод, чем все предыдущие ответы:
git submodule deinit -f .
git submodule update --init
Первая команда полностью "отвязывает" все подмодули, вторая затем делает новую проверку их.
Это займет больше времени, чем другие методы, но будет работать независимо от состояния ваших подмодулей.
Хорошо для меня, имея
git reset --hard
просто reset подмодуль к состоянию, в котором он был извлечен, не обязательно для основного репо, связанного с фиксацией/состоянием. У меня все равно будет "измененное содержимое", как сказал О.П. Итак, чтобы вернуть подмодуль обратно к исправлению commit, я запускаю:
git submodule update --init
Тогда, когда я делаю git status
, он очищается на подмодуле.
выполните 4 этапа:
git submodule foreach git reset --hard HEAD
git submodule update
git submodule foreach "git checkout master; git pull"
git submodule foreach git clean -f
Это работает с нашими библиотеками под управлением GIT v1.7.1, где у нас есть репо репозитория DEV и LIVE package repo. Сами репозитории - это не что иное, как оболочка для упаковки активов для проекта. все подмодули.
LIVE никогда не обновляется намеренно, однако могут возникать файлы кеширования или несчастные случаи, в результате чего репо загрязняется. Новые подмодули, добавленные в DEV, также должны быть инициализированы в LIVE.
Репозиторий пакетов в DEV
Здесь мы хотим вытащить все восходящие изменения, о которых мы еще не знаем, затем мы обновим наш репозиторий пакетов.
# 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
Репозиторий пакетов в LIVE
Здесь мы хотим вытащить изменения, которые привязаны к хранилищу DEV, но не неизвестные изменения в верхнем течении.
# Pull changes
git pull
# Pull status (this is required for the submodule update to work)
git status
# Initialize / Update
git submodule update --init --recursive
Так как Git 2.14 (Q3 2017), вам не нужно входить в каждый подмодуль, чтобы сделать git reset
(как в git submodule foreach git reset --hard
)
Это потому, что Git reset сам знает, как рекурсивно перейти в подмодули.
См. commit 35b96d1 (21 апреля 2017 г.) и commit f2d4899, commit 823bab0, commit cd279e2 (18 апреля 2017 г.) Стефан Беллер (stefanbeller
).
(слияние Junio C Hamano - gitster
- в совершить 5f074ca, 29 мая 2017 года)
встроенный / reset: добавить -recurse-subodules switch
git-reset
- еще один рабочий манипулятор дерева, который следует изучать о субмодулях.
Когда пользователь использует git - reset и запрашивает рекурсию в подмодули, это будет reset подмодули к имени объекта, записанному в суперпроект, отсоединяющий HEADs.
Предупреждение: разница между:
git reset --hard --recurse-submodule
иgit submodule foreach git reset --hard
заключается в том, что первый будет также reset вашим основным родительским деревом репо, поскольку последний будет только reset работающим деревом подмодулей.
Поэтому используйте с осторожностью.
Это сработало для меня, включая рекурсивно в подмодулях (возможно, почему ваш -f не работал, вы изменили подмодуль внутри подмодуля):
git submodule update -f --recursive
Для git <= 2.13 эти две объединенные команды должны reset ваши репозиции с рекурсивными подмодулями:
git submodule foreach --recursive git reset --hard
git submodule update --recursive --init
мой путь к reset всем подмодулям (БЕЗ отсоединения и сохранения их "ведущей" ветки):
git подмодуль foreach 'git мастер проверки и && & git reset --hard $sha1 '