Почему `git submodule` требует извлечения из удаленного репозитория каждый раз? - PullRequest
6 голосов
/ 19 октября 2011

Судя только по количеству результатов для "git submodule" здесь только на SO, это явно часто задаваемая и легко запутанная тема, поэтому я постараюсь быть максимально точным.

Забывание всего об обновлении / фиксации / ветвлении подмодулей (что, как я понимаю, сильно усложняет), почему подмодули очищаются каждый раз, когда я меняю ветви? Насколько я понимаю, это делает ветки дорогими ; Что делать, если я в аэропорту и не могу легко / дешево связаться? Я делаю что-то не так, или есть какая-то философия развития, о которой я еще не знаю?

Примеры никогда не обижают:

## make a new project
$> git --version
git version 1.7.5.4
$> mkdir new_proj; cd new_proj; git init
$> touch new_file_1.txt; touch new_file_2.txt
$> git add . && git commit -m "first commit"

## move into some development branch
$> git checkout -b cool_feature
$> <hack hack hack>
# in the middle, I add a submodule
$> git submodule add https://github.com/some/other_proj.git other_proj
$> git submodule update --init
$> ls -lR
new_file_1.txt
new_file_2.txt
other_proj
other_proj/that_file
other_proj/another_file

## I have to go back to master to do some work
$> git checkout master
# Why is other_proj still around?
$> git status
Untracked: other_proj
## Fine, I'll remove it, since I want a clean working copy, because I need to do some work and commits
$> git clean -f -d
$> <work work work>

## Now I'm ready to go back to cool_feature, but my submodules are empty!
$> git checkout cool_feature

На данный момент я должен git submodule update, но что, если я не могу / это дорого (например, это удаленно, и у меня нет доступа в интернет / это медленно).

Лучший обходной путь, который я нашел, - это клонировать все подмодули, которые мне нужны, в совершенно отдельное место, а затем подмодуль из моих локальных клонов; это сохраняет дешевизну подмодулей. Конечно, это добавляет еще один уровень сложности, когда вы работаете в команде. : /

1 Ответ

2 голосов
/ 19 октября 2011

Учитывая, что подмодуль является ничем иным, как указателем на фиксацию другого репо , git submodule update немного неизбежен (для возврата содержимого, связанного с указанным указателем).

Еще один обходной путь - клонирование вашего основного репо:

  • один для ветки cool_feature, где у вас есть ваши подмодули
  • один для основной ветки, где у вас нет подмодулей

Переключение с одной ветви на другую не потребует git checkout (и связанного с ним git submodule update), но изменения пути.

Другой обходной путь, если вы хотите работать в одном каталоге, описан в " Заменен сторонний код на подмодули git, теперь я не могу переключать ветки "

переместить каталог подмодуля в сторону перед переключением на ветку master

...