Каков рабочий процесс для очистки подмодулей git на клонах?
Есть полезные ответы, как удалить подмодули "локально" - Как удалить подмодуль?
Однако у меня есть проблема, когда у меня есть клоны моего репо на нескольких машинах. Два я работаю один или два раза в месяц. Поэтому, когда я обновляю ветки на них, хотя подмодули больше не отслеживаются, файлы все еще находятся в рабочей ветки, а также в .git/modules
. Несколько раз я случайно проверил некоторые. В других случаях у меня сбои сборки из-за наличия этих нежелательных файлов/каталогов.
Полагаю, я мог бы сохранить список вещей для удаления - но это не кажется правильным - как насчет другого человека сделать удаление, и у меня нет информации вне git, что удалить?
Итак, каков предложенный способ очистки клонов?
Обновить
Для меня git --version
возвращает git version 2.18.0
которая кажется текущей (это 2018-09-01).
Я добавляю воспроизводимый пример.
Настроить
mkdir parent
cd parent
git init
git submodule add https://github.com/jakesgordon/javascript-tetris.git
git commit -am add
cd ..
git clone parent clone
cd clone
git submodule update --init
Теперь оба каталога содержат подмодуль с проверенными файлами в javascript-tetris/
. .gitmodules
содержит подмодуль.
Когда я делаю
cd parent
git rm javascript-tetris
git commit -am delete
В родителе каталог javascript-tetris
ушел, а запись в .gitmodules
удалена. Но остается заполненный каталог .git/modules/javascript-tetris
.
на стороне клона:
git pull
дает предупреждение: warning: unable to rmdir 'javascript-tetris': Directory not empty
. И каталог остается, также .git/modules/javascript-tetris
все еще существует.
Ответы
Ответ 1
Немного, как в этом вопросе, вы можете начать свою рабочую сессию на этих машинах с чистой git:
git clean -xfdf
Используйте силу дважды, чтобы очистить каталоги с подкаталогами .git
: git clean -xfdf
.
У меня были некоторые запутывающие подмодули, которые не удалялись бы с помощью git clean -xfd
.
Ответ 2
git rm
должен обрабатывать всю грязную работу, но нет.
Документы показывают, что вы захотите вручную .git/modules
каталог .git/modules
. Лучший вариант, который я нашел до сих пор, основывается на ответе VonC на пост-обработку вывода с помощью sed
и xargs
:
git clean -xfdf | sed 's/Removing /\.git\/modules\//' |xargs rm -rf
Я не очень люблю этот вариант, так как он довольно хрупкий и зависит от того, что очистка еще не выполнена. Вероятно, вам лучше проверить, не являются ли локальные коммиты в клоне и повторно клонируются с нуля на других рабочих станциях.
Ответ 3
К сожалению, прямая единственная команда для полного удаления Git Submodule, похоже, не существует.
См. Ниже выдержку из документации Git Submodules:
Удаленный подмодуль: подмодуль можно удалить, выполнив git rm && git commit. Это можно отменить с помощью git revert.
Удаление удаляет данные отслеживания суперпроектов, которые являются как записью gitlink, так и секцией в файле.gitmodules. Рабочий каталог подмодулей удаляется из файловой системы, но каталог Git хранится вокруг, чтобы сделать возможным проверку прошлых коммитов, не требуя выборки из другого репозитория.
Чтобы полностью удалить подмодуль, вручную удалите $ GIT_DIR/modules/{name}/.
Однако вы можете легко создать свою собственную команду git для выполнения таких задач, как описано в этом ответе.
Например, вы можете создать файл со следующим сценарием bash:
#!/bin/bash
echo "Running git rm ${1}"
git rm $1
echo "Running rm -rf .git/submodules/${1}"
rm -rf .git/modules/$1
exit 0
Затем вам нужно поместить его в каталог, видимый в вашем PATH (например, в моем случае это может быть C:\Program Files\Git\cmd
) и называть его git-{my_command_name}
(например, git-rm-module
).
Таким образом, вы можете использовать его как git rm-module {my-submodule-name}
. И результатом будет:
$ git rm-module my-submodule-name
Running git rm-submodule my-submodule-name
Running rm -rf .git/submodules/my-submodule-name
Для сложных опций вы можете получить вдохновение от этой команды git activity.
Ответ 4
Это полезно для вас?
git clean -xfd
git submodule foreach --recursive git clean -xfd
git reset --hard
git submodule foreach --recursive git reset --hard
git submodule update --init --recursive
ОБНОВИТЬ
Чтобы удалить подмодуль, вам необходимо: