2009-10-20 2 views
37

В моем проекте мне нужно использовать сторонний код, хранящийся в нескольких хранилищах Git. Мой проект также хранится в (отдельном) хранилище Git. В основном проекте работает несколько человек, и я - сопровождающий.Рабочий процесс Git subodules

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

Теперь это довольно неудобно, так как мне нужно ежедневно обновлять одну из зависимостей и часто вносить в нее код сам, в большинстве случаев, вместе с изменениями в основной проект.

Я решил попробовать подмодули Git для управления. Чем больше я их пытаюсь, тем больше разочаровываю. Кажется, что ручная копия, возможно, лучше.

Вот некоторые из моих проблем:

  • Мы уже больше не в состоянии получить согласованное состояние хранилища с помощью одной команды (git checkout теперь нуждается git submodule update --init).
  • Мы не можем использовать некоторые из инструментов Git правильно (git archive - это самый известный).
  • Мы не можем видеть изменения/отличия статуса в подмодулях из основного проекта.
  • Как я только что нашел, git submodule не работает с параметрами --git-dir и --work-tree и требует физического изменения текущего каталога до «верхнего уровня рабочего дерева».

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

Обратите внимание, что это не вариант перехода от Git или объединения проекта подпроекта полностью в основной проект.

Возможно, я пользуюсь git submodules неправильным способом? Есть ли хороший учебник по документообороту?

Пожалуйста, говорите, даже если вы не знаете правильный ответ, но разделяете мои проблемы. :-)

+6

Один из моих других любимых подмодулях подводных камней, если вы удалите подмодуль, и заменить его новым подмодуль в том же месте, он разбивает хранилище для всех остальных. (например, кто-то разворачивает библиотеку в github, и вы переключаете подмодуль на то, чтобы указывать на fork.) Обход - это удаление подмодуля, его все тянуть и обновлять, а затем заменять подмодуль и каждый раз тянуть и обновлять снова. –

+0

Я думал, что кто-то украл это сообщение и опубликовал его на habr без справки, но потом я посмотрел на имя ... :-D Тем не менее, ссылка на SO была бы приятной, я думаю. –

+1

Есть один.Посмотрите ближе на ссылки в тексте. –

ответ

11

Вместо этого вы можете попробовать git subtree (alt link). Мне было очень повезло с этим, используя как удаленные репозитории, так и чистые (связанные с master) ветви в моем проекте.

+1

Я пробовал поддерево git, и оно значительно превосходит подмодули git для моих задач. Благодаря! –

+0

Первая ссылка не работает. Я знаю, что вы предоставляете ссылку alt. Но я просто хотел сообщить вам. – Eduardo

+0

@EduardoCereto - обе ссылки работают нормально на данный момент. – FooF

4

Недавний поток в списке рассылки git содержит патч для получения согласованного состояния репозитория с помощью одной команды. Он в основном вызывает обновление подмодуля git при смене ветвей.

http://thread.gmane.org/gmane.comp.version-control.git/130155/focus=130330