Подтвердить что ты не робот

Git репо внутри репо

Я хочу клонировать https://github.com/getyouridx/pychargify в проект django, и вам нужно будет время от времени обновлять обновления.

Просто для пояснения, могу ли я просто написать gitignore из корневого каталога проекта django, например. .gitignore: pychargify/.git или есть другие подводные камни, о которых я должен знать?

4b9b3361

Ответ 1

Чтобы иметь один git репо "внутри" другого, посмотрите на git подмодули: http://git-scm.com/book/en/Git-Tools-Submodules

Сделав pychargify подмодуль вашего проекта django, конкретные изменения вашего проекта django могут быть связаны с конкретными изменениями вашего проекта pychargify. Это может быть действительно полезно.

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

Ответ 2

Git имеет функцию для хранения репозитория в другом: submodules.

git submodule add https://github.com/getyouridx/pychargify.git

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

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

Ответ 3

Git автоматически игнорирует и даже не позволит вам добавить файл/папку с именем .git. Таким образом, вы можете просто добавить репо в свое репо и поработать над ним. Возможно, вам придется игнорировать внутреннюю папку repo pychargify.

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

Ответ 4

Git поддеревья

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

Тем не менее, можно утверждать, что путь подмодулей - это не единственный способ и случайность не в правильном направлении, в зависимости от установленных рабочих процессов, по нескольким причинам, которые я не собираюсь анализировать и которые кратко упоминаются на нескольких страницах, таких как как this и this. Наиболее важным является, возможно, следующее:

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

Конечно, в идеальном рабочем потоке этого никогда не будет.

Еще одна важная причина в том, что популярная среда PyCharm IDE (когда это написано, для этого есть очень старая проблема) и, возможно, другие как не полностью реализуют подмодули w22 > , и кодер потеряет, среди прочих, отличную функциональность IDE, отображающую все измененные строки в подмодуле.

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

Итак, на практическом примере, чтобы справиться с ситуацией, вызывающей беспокойство, допустим, что subproject потребляется в project:

$ git remote add subproject_remote (url)
# subproject_remote is the new branch name and (url) where to get it from, it could be a path to a local git repo

$ git subtree add —-prefix=subproject/ subproject_remote master
# the prefix is the name of the directory to place the subproject

$ git commit -am "Added subproject"
# possibly commit this along with any changes

Если подпроект изменится, вытащите его в project:

git subtree pull —prefix=subproject subproject_remote master

... или наоборот (если изменения в subproject внутри project):

git subtree push —prefix=subproject subproject_remote new_branch

Аналитический, но довольно громоздкий учебник в этой ссылке.

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

Ответ 5

Добавление папки, содержащей проект git в рамках другого проекта git, работает так, как вы могли ожидать: между ними нет прямого взаимодействия, и вы можете самостоятельно фиксировать изменения, работая в одном каталоге или другом. Вы можете либо запустить "родительский" проект, либо полностью заблокировать внутреннюю папку, либо вы можете зафиксировать выбранные файлы из дочерней папки, как если бы они были частью родительского проекта.

Если вы делаете последнее, то при изменении файла он будет видоизменяться как с помощью проектов git, так и самостоятельно управлять этими изменениями (зафиксировать изменения), просто работая в одном каталоге или другом.

Я предполагаю, что вы используете инструменты командной строки здесь, хотя я считаю, что XCode 7 может понять ситуацию и отобразить аннотации изменений в файлах, если файлы видны как измененные одним или обоими git репозиториев.

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