Как я могу связать зависимости в git-репо?

149

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

Есть идеи о том, что я могу сделать?

Леа Веру
источник

Ответы:

212

Вы можете сделать это с помощью подмодулей в git. В вашем хранилище выполните:

git submodule add path_to_repo path_where_you_want_it

Итак, если в хранилище библиотеки был URL-адрес, git://github.com/example/some_lib.gitи вы хотели, чтобы он был lib/some_libв вашем проекте, вы должны ввести:

git submodule add git://github.com/example/some_lib.git lib/some_lib

Обратите внимание, что это нужно сделать из каталога верхнего уровня в вашем хранилище. Так что не cdв каталог, где вы помещаете это первым.

После того, как вы добавите подмодуль или когда кто-нибудь сделает новую проверку вашего хранилища, вам нужно будет сделать:

git submodule init
git submodule update

И тогда все добавленные вами подмодули будут проверены с той же ревизией, что и у вас.

Если вы хотите обновить до более новой версии одной из библиотек, cdв подмодуль и потяните:

cd lib/some_lib
git pull

Затем, когда вы делаете, git statusвы должны увидеть lib/somelibсписок в измененном разделе. Добавьте этот файл, подтвердите, и вы в курсе. Когда соавтор извлекает эти коммиты в свой репозиторий, они будут видеть lib/somelibизмененные, пока не запустятся git submodule updateснова.

Эмили
источник
2
Спасибо за ваш ответ, проголосовал! (и, вероятно, примет это завтра) Есть ли способ добавить только один файл из другого репо в качестве зависимости? Или это должна быть целая папка?
Леа Веру
2
Если вы хотите отследить его как подмодуль (и, таким образом, иметь возможность легко получать обновления), вам придется загружать весь репозиторий. В отличие от многих других VCS, git действительно хочет иметь дело только с хранилищем верхнего уровня.
Эмили
7
Прочтите это, чтобы узнать, для чего нужен подмодуль и как обойти потенциальные проблемы. и обсуждение об этом .
Минхуа
1
Допустим, вы импортируете в качестве субмодуля другое ваше хранилище. Можете ли вы внести изменения в исходное репо через локальные изменения в подмодуле? Допустим, вы нашли ошибку и нужно обновить оригинал?
andrevenancio
3
Я знаю, что это старый ответ, но подмодули git могут быть обновлены с помощью git submodule update --remoteя рекомендую использовать больше флагов, хотя для более сложных проектов. Я используюgit submodule update --remote --recursive --init
Крис