У меня есть подмодуль 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
не восстанавливать локально измененные файлы.
Как мне сбросить содержимое этого подмодуля?
git
git-submodules
Эрик
источник
источник
git reset --hard
не работает, сначала попробуйте указать удаленную ветку с помощьюgit reset --hard origin/<branch_name>
.Ответы:
Перейдите в каталог подмодуля, затем выполните команду a,
git reset --hard
чтобы вернуть все измененные файлы в их последнее зафиксированное состояние. Имейте в виду, что при этом будут отменены все неподтвержденные изменения.источник
git submodule update --init
работал на меня; без--init
этого не сработало вообще.git submodule update -f --init
для моего случая.Если вы хотите сделать это для всех подмодулей, без необходимости изменять каталоги, вы можете выполнить
git submodule foreach git reset --hard
Вы также можете использовать рекурсивный флаг для применения ко всем подмодулям:
git submodule foreach --recursive git reset --hard
источник
git submodule foreach --recursive git clean -x -f -d
Более надежный метод, чем все предыдущие ответы:
Первая команда полностью «отменяет привязку» всех подмодулей, а вторая делает новую проверку их.
Это займет больше времени, чем другие методы, но будет работать независимо от состояния ваших подмодулей.
источник
error: Your local changes to the following files would be overwritten by checkout
*
в моем ,PS1
чтоgit status -uno
не смог объяснить).Хорошо для меня, имея
просто сбросьте подмодуль в состояние, в котором он был извлечен, а не обязательно для основного репо, на который ссылается commit / state репо. У меня все еще будет «измененное содержимое», как сказал OP. Итак, чтобы вернуть субмодуль в фиксацию исправлений, я запускаю:
Потом, когда я это сделаю
git status
, в подмодуле все чисто.источник
submodule update --init
, в любом случае, похоже, не отменять локальные модификации: |сделать 4 шага подряд:
источник
git submodule update
было то, что исправило(new commits)
для меня.Это сработало для меня, в том числе рекурсивно в подмодули (возможно, именно поэтому ваш -f не работал, потому что вы изменили подмодуль внутри подмодуля):
источник
Сначала попробуйте это, как говорили другие:
Если это не сработает, перейдите в каталог подмодулей и используйте следующую команду, чтобы увидеть, есть ли какие-либо изменения в подмодуле:
Если есть изменения в вашем подмодуле, избавьтесь от них. Убедитесь, что вы не видите никаких изменений при запуске «git status».
Затем вернитесь в основной репозиторий и снова запустите «git submodule update --init».
источник
Начиная с Git 2.14 (3 квартал 2017 года), вам не нужно заходить в каждый подмодуль, чтобы выполнить
git reset
(как вgit submodule foreach git reset --hard
)Это потому, что сам git reset теперь знает, как рекурсивно войти в подмодули.
Смотрите коммит 35b96d1 (21 апреля 2017 г.) и коммит f2d4899 , коммит 823bab0 , коммит cd279e2 (18 апр 2017 г.) от Stefan Beller (
stefanbeller
) .(Слиты Junio C Hamano -
gitster
- в фиксации 5f074ca , 29 мая 2017)git-reset
это еще один рабочий манипулятор дерева, который нужно учить о подмодулях.Внимание : разница между:
git reset --hard --recurse-submodule
иgit submodule foreach git reset --hard
Это то, что первый также сбрасывает ваше главное рабочее дерево родительского репо, так как последний сбрасывает только рабочее дерево подмодулей.
Так что используйте с осторожностью.
источник
Для git <= 2.13 эти две команды вместе должны сбросить ваши репозитории с рекурсивными подмодулями:
источник
Это работает с нашими библиотеками, работающими с GIT v1.7.1, где у нас есть репозиторий DEV и репозиторий LIVE. Сами репозитории - не что иное, как оболочка для упаковки ресурсов для проекта. все подмодули.
LIVE никогда не обновляется преднамеренно, однако файлы кэша или несчастные случаи могут произойти, оставляя грязное хранилище. Новые субмодули, добавленные в DEV, также должны быть инициализированы в LIVE.
Хранилище пакетов в DEV
Здесь мы хотим вытащить все восходящие изменения, о которых мы еще не знаем, затем мы обновим наш репозиторий пакетов.
Хранилище пакетов в LIVE
Здесь мы хотим получить изменения, которые зафиксированы в репозитории DEV, но не неизвестны вышестоящие изменения.
источник
Если вы хотите отменить все изменения во всем хранилище вместе с подмодулями, вы можете использовать
git restore . --recurse-submodules
Это отменит все изменения, сделанные в хранилище и в подмодулях.
источник
мой способ сброса всех подмодулей (БЕЗ отсоединения и сохранения их "основной" ветки):
подмодуль git foreach 'мастер проверки git && сброс git --hard $ sha1'
источник