2017-02-04 10 views
3

У меня есть репозиторий github с именем «foo» (или, скорее, «myusername/foo»). Теперь предположим, что я хочу создать репозиторий с именем «bar», который использует код в foo; Я могу просто сделать копию файлов, но я не хочу получать обновления - я хочу всегда видеть только то, что находится в репозитории «foo» прямо сейчас; и не иметь фиксации «обновлений от foo». Я считаю, что я заметил некоторые репозитории, в которых подпапки фактически являются отдельными репозиториями; и я знаю, что git поддерживает субрепозитории или что-то подобное. Итак, могу ли я выполнить такое «монтирование хранилища»? Если да, то как?Как «установить» один репозиторий github в качестве подпапки другого репозитория?

Бонусные баллы, если я могу иметь «монтировать» в определенной версии, или в определенной отрасли, а не мастер

+1

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

+0

@TimBiegeleisen: Ссылка? И ... вы имеете в виду, что это функция GitHub или функция git? – einpoklum

+0

Вот один из них: http://blog.joncairns.com/2011/10/how-to-use-git-submodules/ –

ответ

3

У вас есть 2 основные опции для управления подпроекта в мерзавца.
Git не имеет менеджер зависимостей и наиболее распространенные варианты являются следующие:

  • субмодуля
  • поддерево

Submodules Разрешить использование внешних хранилищ в пределах выделенного подкаталога исходного дерева, всегда указываемого на конкретную фиксацию.


git submodule

Для того, чтобы использовать подмодуль каждую папку будет автономным хранилищем и будет управляться и храниться в другом месте. Git проверит конкретную фиксацию (фиксацию, версию, тег и т. Д.) И будет использовать ее как HEAD подмодуля. В большинстве случаев подмодуль будет находиться в отдельной головке.

# once you have a repo simply add it to git 
git submodule add <url> 

Как только проецируется на ваш репо, вы должны его инициализировать и обновить.

git submodule init 
git submodule update 

На Git 1.8.2 новый вариант --remote был добавлен

git submodule update --remote --merge 

будет fetch последние изменения от входа в каждый подмодуль, merge them in и check out последняя редакция подмодуля.

Как the docs описать:

--remote

Эта опция действительна только для команды обновления. Вместо использования зарегистрированного SHA-1 суперпроекта для обновления подмодуля, используйте состояние ветви удаленного отслеживания подмодуля.

Это эквивалентно запуску git в каждом подмодуле.


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

с помощью подмодуль будет поместить код внутри вашего основного проекта в рамках его содержания [Новая папка].

Различие между его локально внутри папки или наличием ее как части субмодуля заключается в том, что в подмодуле контент управляется (переводится) в другой автономный репозиторий, как описано выше.


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

enter image description here


git subtree

Git поддерево позволяет вставить любой репозиторий в подкаталог другого одного

Очень похож на submodule, но основное различие заключается в том, где ваш код управляется. В подмодулях содержимое помещается внутри отдельного репо и управляется там, что позволяет вам клонировать его также и ко многим другим репозиториям.

subtree управляет содержанием как часть корневого проекта, а не в отдельном проекте.

Вместо того, чтобы записывать, как настроить его и понять, как его использовать, вы можете просто прочитать этот отличный пост, который объяснит все это.

https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree/

+0

О git subodule: Я не понял ... (1) Когда «когда-то у вас есть репо "? Когда и в какой CWD я могу внести команду подменю subodule? (2) Где в приведенных вами командах я должен указать, в какую подпапку субмодуль проверяется в (3), как HEAD может быть чем-то другим, кроме последнего фиксации на ветке? Вы сказали, что, если я выберу определенную сделку с репо, я стану моим руководителем; что, по-видимому, противоречит определению, к которому вы привязались. – einpoklum

+1

(1): как только у вас есть репо - создайте новый репо для кода, который вы хотите иметь, который не является частью исходного репо. (2) имя подмодуля будет папкой или вы можете передать дополнительные параметры для указания имени. (3) git может указывать на любой фиксатор не только последний. попробуйте следующее: 'git checkout HEAD ~ 10' – CodeWizard

2

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

В таком случае вы можете разместить другой репозиторий в подкаталоге и добавить этот подкаталог в файл .gitignore.

E.g.

RepositoryA/ 
    - .gitignore (first option) 
    - SomeDir/ 
    - .gitignore (second option) 
    - RepositoryB/ 

.gitignore (первый вариант)

Добавьте один из них:

  • SomeDir/RepositoryB/
  • **/RepositoryB/

.gitignore (второй вариант)

Добавить это:

  • RepositoryB/

Таким образом, как я уже сказал, не добавляет логики/управления. Он просто позволяет вам использовать любую ревизию из обоих репозиториев без какого-либо столкновения.