Как вернуть мои изменения в подмодуль git?

У меня есть подмодуль 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 содержимое этого подмодуля?

Ответ 1

Переместитесь в каталог подмодулей, затем сделайте git reset --hard to reset все измененные файлы в их последнее состояние. Имейте в виду, что это отбросит все непреднамеренные изменения.

Ответ 2

Если вы хотите сделать это для всех подмодулей, без необходимости менять каталоги, вы можете выполнить

git submodule foreach git reset --hard

Вы также можете использовать рекурсивный флаг для применения ко всем подмодулям:

git submodule foreach --recursive git reset --hard

Ответ 3

Более безопасный метод, чем все предыдущие ответы:

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

Первая команда полностью "отвязывает" все подмодули, вторая затем делает новую проверку их.
Это займет больше времени, чем другие методы, но будет работать независимо от состояния ваших подмодулей.

Ответ 4

Хорошо для меня, имея

git reset --hard

просто reset подмодуль к состоянию, в котором он был извлечен, не обязательно для основного репо, связанного с фиксацией/состоянием. У меня все равно будет "измененное содержимое", как сказал О.П. Итак, чтобы вернуть подмодуль обратно к исправлению commit, я запускаю:

git submodule update --init

Тогда, когда я делаю git status, он очищается на подмодуле.

Ответ 5

выполните 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

Ответ 6

Это работает с нашими библиотеками под управлением 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

Ответ 7

Так как 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 работающим деревом подмодулей.
Поэтому используйте с осторожностью.

Ответ 8

Это сработало для меня, включая рекурсивно в подмодулях (возможно, почему ваш -f не работал, вы изменили подмодуль внутри подмодуля):

git submodule update -f --recursive

Ответ 9

Для git <= 2.13 эти две объединенные команды должны reset ваши репозиции с рекурсивными подмодулями:

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

Ответ 10

мой путь к reset всем подмодулям (БЕЗ отсоединения и сохранения их "ведущей" ветки):

git подмодуль foreach 'git мастер проверки и && & git reset --hard $sha1 '