Как указать ветку / тег при добавлении подмодуля Git?

Я был одержим этой проблемой, когда я изучал Руби. Это было лучшее, что я мог сделать:

def spiral(matrix)
  matrix.empty? ? [] : matrix.shift + spiral(matrix.transpose.reverse)
end

Вы можете проверить некоторые из моих других решений, отступив через ревизии в этом gist . Кроме того, если вы перейдете по ссылке, к которой я разветвлял суть, вы найдете некоторые другие умные решения. Действительно интересная проблема, которая может быть решена несколькими элегантными способами - особенно в Ruby.

652
задан Fabio Turati 6 November 2018 в 16:20
поделиться

3 ответа

Примечание. В Git 1.8.2 добавлена ​​возможность отслеживать ветки. См. Некоторые ответы ниже.


Немного запутанно привыкать к этому, но подмодули не находятся в ветке. Они, как вы говорите, просто указатель на конкретную фиксацию репозитория подмодуля.

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

Это отлично подходит для подмодуля, который не часто меняется, потому что тогда каждый в проекте может иметь подмодуль в одной фиксации.

Если вы хотите переместить подмодуль в конкретный тег:

cd submodule_directory
git checkout v1.0
cd ..
git add submodule_directory
git commit -m "moved submodule to v1.0"
git push

Затем другой разработчик, который хочет изменить submodule_directory на этот тег, выполняет эти изменения

git pull
git submodule update --init

git pull , которые фиксируют его каталог подмодуля, указывающий на .

701
ответ дан 22 November 2019 в 21:37
поделиться

Пример как я использую подмодули Git.

  1. Создаем новый репозиторий
  2. Затем клонируем другой репозиторий как подмодуль
  3. Затем у нас есть этот подмодуль, использующий тег под названием V3.1.2
  4. И затем мы фиксируем.

И это выглядит примерно так:

git init 
vi README
git add README
git commit 
git submodule add git://github.com/XXXXX/xxx.yyyy.git stm32_std_lib
git status

git submodule init
git submodule update

cd stm32_std_lib/
git reset --hard V3.1.2 
cd ..
git commit -a

git submodule status 

Может быть, это поможет (хотя я использую тег, а не ветку)?

53
ответ дан 22 November 2019 в 21:37
поделиться

Подмодули Git немного странные - они всегда находятся в режиме «отдельной головы» - они не обновляются до последней фиксации в ветке, как вы могли ожидать.

Это хотя, если подумать, имеет некоторый смысл. Допустим, я создаю репозиторий foo с подмодулем bar . Я нажимаю свои изменения и прошу вас проверить фиксацию a7402be из репозитория foo .

Затем представьте, что кто-то фиксирует изменение в репозитории bar , прежде чем вы сможете создать свой клон. ] Когда вы проверяете фиксацию a7402be из репозитория foo , вы ожидаете получить тот же код, что и я. Вот почему подмодули не обновляются, пока вы явно не скажете им об этом, а затем не сделаете новый коммит.

Лично я считаю, что субмодули - самая запутанная часть Git. Есть много мест, где можно лучше объяснить подмодули, чем я. Я рекомендую Pro Git Скотта Чакона.

32
ответ дан 22 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: