Каков рабочий процесс очистки подмодулей git на клонах?

Есть полезные ответы, как убрать подмодули "локально" - Как удалить подмодуль?

Однако у меня есть проблема, у меня есть клоны моего репо на нескольких машинах. Двое. Я работаю всего один или два раза в месяц. Поэтому, когда я обновляю ветки на них, хотя подмодули больше не отслеживаются, файлы все еще находятся в рабочей ветке в .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 вы используете для своего основного и клонов? Я провел небольшое тестирование с последней сборкой Windows, и теперь управление подмодулями стало намного лучше.

Will Bickford 01.09.2018 09:35
git --version возвращает git version 2.18.0
bdecaf 01.09.2018 10:19

Странно, может я что-то упускаю из твоих клонов. Мой игрушечный пример, похоже, сработал. (Не всегда!)

Will Bickford 01.09.2018 10:37

Может быть, вы пропустили git submodule update --init? Это то, что я упустил в своих первых попытках воспроизвести проблему.

bdecaf 01.09.2018 10:43

Нашел вот это: medium.com/@porteneuve/mastering-git-submodules-34c65e940407

Will Bickford 01.09.2018 10:59

Да, ваши обновленные шаги воспроизводят проблему для меня. Вы можете постобработать вывод git clean. Обновил мой ответ, чтобы предположить это. Но не лучший путь.

Will Bickford 01.09.2018 11:46

Ничего себе, это действительно беспорядок - я провел большую часть дня, исследуя, будет ли git subtree хорошей альтернативой - и нет, мне это тоже не нравится ...

bdecaf 01.09.2018 16:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
7
1 325
4

Ответы 4

Немного как в это суть, вы можете начать свой рабочий сеанс на этих машинах с git clean:

git clean -xfdf

Use force twice to clean directories with .git subdirectories: git clean -xfdf.
I had some tangling submodules that would not get deleted with just git clean -xfd.

Эта команда полезна, но я не думаю, что это решение, поскольку она не очищает .git/modules. Кроме того, поскольку он удаляет файлы без разбора, запускать его без тщательной проверки репозитория кажется опасным.

bdecaf 28.08.2018 14:16

@bdecaf Пробовали, для тестирования?

VonC 28.08.2018 14:16

Да - я не знал всех переключателей (особенно меня смутил второй ф). Это определенно решает некоторые из моих проблем. Все еще надеюсь, что есть полное решение.

bdecaf 28.08.2018 14:58

git rm должен взять на себя всю грязную работу, но не делает этого.

В документации указано, что вы хотите вручную очистить каталог .git/modules. Лучший вариант, который я нашел до сих пор, основан на ответе VonC путем последующей обработки вывода с помощью sed и xargs:

git clean -xfdf | sed 's/Removing /\.git/modules//' |xargs rm -rf

Мне не очень нравится этот вариант, так как он довольно хрупкий и зависит от того, что очистка еще не была выполнена. Вероятно, вам лучше проверить, что в клоне нет локальных коммитов, и повторно клонировать с нуля на других рабочих станциях.

Странно - у меня тоже 2.18, но мусор остался. Поскольку он стал длиннее, я добавил это как воспроизводимый пример к вопросу. Можете ли вы подтвердить, что мы выполняли те же самые команды?

bdecaf 01.09.2018 10:40

Я посмотрю, конечно.

Will Bickford 01.09.2018 10:48

К сожалению, прямой единственной команды для полного удаления подмодуля 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.

К сожалению, моя проблема немного другая. в основном проблема заключается в том, что один или несколько подмодулей удаляются в репо на сервере, и мне нужно очистить локально (но у меня нет явного списка, что нужно удалить).

bdecaf 02.09.2018 15:54

Это полезно для вас?

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 (без косой черты в конце).
  • Коммит git commit -m "Удаленный подмодуль"
  • Удалите теперь неотслеживаемые файлы подмодулей rm -rf path_to_submodule

    Источник

Да и нет. git clean уже предлагался, но мне нравится, как вы адаптировали его для вложенных репозиториев, и, похоже, он полностью сбрасывает его до состояния в основном репо. Меня больше всего беспокоит то, что я не хотел бы запускать его на машине разработки, не проверяя, что он удаляет. Вторичная проблема заключается в том, что он не очищает каталог .git/modules.

bdecaf 03.09.2018 10:02

Нет, вы неправильно поняли - это не помогает, так как мне нужно выяснить, какие (несколько) path_to_submodule мой коллега удалил за последние месяцы. Это не задокументировано, поскольку мы предполагали, что об этом позаботится подмодуль git.

bdecaf 03.09.2018 17:15

Другие вопросы по теме