Каков рабочий процесс для очистки подмодулей 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

ОБНОВИТЬ

Чтобы удалить подмодуль, вам необходимо:

  • Удалите соответствующий раздел из файла.gitmodules.
  • Этап изменения.gitmodules git add.gitmodules
  • Удалите соответствующий раздел из.git/config.
  • Запустить git rm --cached path_to_submodule (без конечной косой черты).
  • Запустите rm -rf.git/modules/path_to_submodule (нет косой черты).
  • Commit git commit -m "Удаленный подмодуль"
  • Удалите теперь необработанные файлы подмодуля rm -rf path_to_submodule

    Источник