Есть полезные ответы, как убрать подмодули "локально" - Как удалить подмодуль?
Однако у меня есть проблема, у меня есть клоны моего репо на нескольких машинах. Двое. Я работаю всего один или два раза в месяц. Поэтому, когда я обновляю ветки на них, хотя подмодули больше не отслеживаются, файлы все еще находятся в рабочей ветке в .git/modules. Несколько раз я случайно проверял некоторые из них. В других случаях у меня случались сбои сборки из-за наличия этих нежелательных файлов / каталогов.
Я полагаю, что мог бы сохранить список вещей, которые нужно удалить, но это кажется неправильным - как насчет того, чтобы другой человек сделал удаление, а у меня нет информации за пределами git, что удалить?
Итак, каков предлагаемый способ очистки клонов?
Обновить
Для меня git --version возвращает git version 2.18.0, который кажется актуальным (это 01.09.2018).
Добавляю воспроизводимый пример.
Настраивать
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 все еще там.
git --version возвращает git version 2.18.0Странно, может я что-то упускаю из твоих клонов. Мой игрушечный пример, похоже, сработал. (Не всегда!)
Может быть, вы пропустили git submodule update --init? Это то, что я упустил в своих первых попытках воспроизвести проблему.
Нашел вот это: medium.com/@porteneuve/mastering-git-submodules-34c65e940407
Да, ваши обновленные шаги воспроизводят проблему для меня. Вы можете постобработать вывод git clean. Обновил мой ответ, чтобы предположить это. Но не лучший путь.
Ничего себе, это действительно беспорядок - я провел большую часть дня, исследуя, будет ли git subtree хорошей альтернативой - и нет, мне это тоже не нравится ...





Немного как в это суть, вы можете начать свой рабочий сеанс на этих машинах с git clean:
git clean -xfdf
Use force twice to clean directories with
.gitsubdirectories:git clean -xfdf.
I had some tangling submodules that would not get deleted with justgit clean -xfd.
Эта команда полезна, но я не думаю, что это решение, поскольку она не очищает .git/modules. Кроме того, поскольку он удаляет файлы без разбора, запускать его без тщательной проверки репозитория кажется опасным.
@bdecaf Пробовали, для тестирования?
Да - я не знал всех переключателей (особенно меня смутил второй ф). Это определенно решает некоторые из моих проблем. Все еще надеюсь, что есть полное решение.
git rm должен взять на себя всю грязную работу, но не делает этого.
В документации указано, что вы хотите вручную очистить каталог .git/modules. Лучший вариант, который я нашел до сих пор, основан на ответе VonC путем последующей обработки вывода с помощью sed и xargs:
git clean -xfdf | sed 's/Removing /\.git/modules//' |xargs rm -rf
Мне не очень нравится этот вариант, так как он довольно хрупкий и зависит от того, что очистка еще не была выполнена. Вероятно, вам лучше проверить, что в клоне нет локальных коммитов, и повторно клонировать с нуля на других рабочих станциях.
Странно - у меня тоже 2.18, но мусор остался. Поскольку он стал длиннее, я добавил это как воспроизводимый пример к вопросу. Можете ли вы подтвердить, что мы выполняли те же самые команды?
Я посмотрю, конечно.
К сожалению, прямой единственной команды для полного удаления подмодуля Git, похоже, не существует.
См. Ниже выдержку из Документация по подмодулям Git:
Deleted submodule: A submodule can be deleted by running git rm && git commit. This can be undone using git revert.
The deletion removes the superproject’s tracking data, which are both the gitlink entry and the section in the .gitmodules file. The submodule’s working directory is removed from the file system, but the Git directory is kept around as it to make it possible to checkout past commits without requiring fetching from another repository.
To completely remove a submodule, manually delete $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.
К сожалению, моя проблема немного другая. в основном проблема заключается в том, что один или несколько подмодулей удаляются в репо на сервере, и мне нужно очистить локально (но у меня нет явного списка, что нужно удалить).
Это полезно для вас?
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
ОБНОВИТЬ
Чтобы удалить подмодуль, вам необходимо:
Удалите теперь неотслеживаемые файлы подмодулей rm -rf path_to_submodule
Да и нет. git clean уже предлагался, но мне нравится, как вы адаптировали его для вложенных репозиториев, и, похоже, он полностью сбрасывает его до состояния в основном репо. Меня больше всего беспокоит то, что я не хотел бы запускать его на машине разработки, не проверяя, что он удаляет. Вторичная проблема заключается в том, что он не очищает каталог .git/modules.
Нет, вы неправильно поняли - это не помогает, так как мне нужно выяснить, какие (несколько) path_to_submodule мой коллега удалил за последние месяцы. Это не задокументировано, поскольку мы предполагали, что об этом позаботится подмодуль git.
Какие версии git вы используете для своего основного и клонов? Я провел небольшое тестирование с последней сборкой Windows, и теперь управление подмодулями стало намного лучше.