Отменить субмодуляцию в git?
============================

Наша небольшая команда подумала, что было бы замечательно, если бы библиотеки (X, Y, Z) нашего проекта A были разделены на подмодули git. Мало ли мы понимали, насколько велика боль, которая будет, тем более, что проект все еще находится на ранних стадиях и пока еще не изолирован. Я думаю, что руководитель проекта сделал подмодули подкаталогов через команду git filter-branch (я не могу попросить его b/c он в отпуске).

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

Примеры "боли":

* Проект A должен указывать на X, Y, Z через 'git://' ссылки вместо 'ssh://', если мы хотим, чтобы пользователи могли проверить его без доступа ssh, t вносить изменения непосредственно в X через копию A/X, если мы хотим, чтобы мы могли нажать - мы должны клонировать его отдельно, совершать, нажимать, а затем извлекать из копии A/X.
* Кроме того, TortoiseGit и другие инструменты Windows, похоже, не понимают подмодули, или, по крайней мере, они не делают его прозрачным, как просто клонирование, поэтому теперь мы собираем вещи с глупыми скриптами и перехватами.
* О да... для каждого изменения в X, Y или Z мы должны добавить в основной проект коммивояж "Обновленный подмодуль". Я предполагаю, что подмодули предназначены для гораздо более зрелых проектов, которые поддерживаются разными командами.

 

Вы можете легко объединить все репозитории вместе в один, им не обязательно иметь что-то общее для их объединения, вам просто нужно предотвратить конфликты файлов. Поэтому сначала переместите все файлы в отдельные репозитории в нужную папку, где они должны быть в объединенной, а не просто слить эти отдельные репозитории.

 

Я не обязательно рекомендую это как курс действий, но я написал script (unsubmodule.py), который должен удалить и затем объединить каждый подмодуль в качестве подкаталога с тем же именем, сохраняя история совершенной версии каждого подмодуля:

 <https://gist.github.com/763439>

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

ⁱ (И по той причине, что Джонатан Леффлер упоминает в своем комментарии и потому, что я работаю над несколькими проектами, которые используют подмодули без серьезных проблем.)

 

>  Проект A должен указывать на X, Y, Z через 'git://' ссылки вместо 'ssh://', если мы хотим, чтобы пользователи могли проверить его без доступа ssh, t вносить изменения непосредственно в X через копию A/X, если мы хотим, чтобы мы могли нажать - мы должны клонировать его отдельно, совершать, нажимать, а затем извлекать из копии A/X.
> 
> 
> 

Похоже, вы хотите...

```
[remote "origin"]
        url = git://foobar
        pushurl = ssh://[[email protected]](/cdn-cgi/l/email-protection)/srv/git/foobar

```

>  О да, для каждого изменения в X, Y или Z мы должны добавить в основной проект коммит "Submodule updated".
> 
> 
> 

Субмодули работают как skiplist, поэтому этого и следовало ожидать. Если вам это не нравится, подумайте об использовании крюка на стороне сервера для обновления основного проекта всякий раз, когда выполняется фиксация в подпроекте.