Как лучше всего помещать несколько проектов в репозиторий git? [закрыто]

188

По какой-то причине у меня есть только один репозиторий для использования.
Но у меня есть несколько проектов, включая javaпроекты, php scriptsиAndroid проекты приложений.

Теперь моя проблема заключается в том, что я должен поместить их в разные подпапки внутри хранилища.
Я использую разные IDE. Вы знаете, что каждая IDE может иметь свое рабочее пространство.

Кто может подсказать мне лучшую практику для решения проблемы?

каменистый
источник
1
Возможное решение может быть stackoverflow.com/questions/5514739/… или stackoverflow.com/a/7931825/828197
Ragnarokkr
2
Ты не один. У меня есть похожий случай с моими репозиториями, которые я использую в учебных целях (пример: github.com/hopbit/java-sandbox ). Я не хочу создавать новое репо, чтобы попробовать примеры для каждой новой книги / учебника, который я начинаю читать ...
Łukasz Siwiński
Одна из причин, по которой вы захотите это сделать, - если у вас есть один проект, представляющий собой код продукта, который вы развертываете в среде выполнения, такой как тестовая или производственная. Второй проект - это приложение, которое тестирует систему (например, BDD) первого проекта. Между этими двумя проектами существует тесная связь, и теперь вы можете поддерживать / ссылаться на всю совокупность, используя один URL-адрес хранилища.
Lance Kind
Сводка ниже: «Git не знает, являются ли они частями одного и того же или разных проектов»
ahmednabil88

Ответы:

198

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

Решение 1

Один репозиторий может содержать несколько независимых ветвей, называемых сиротскими ветвями . Сиротские ветви полностью отделены друг от друга; они не делятся историями.

git checkout --orphan BRANCHNAME

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

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

rm .git/index
rm -r *

Убедитесь, что все передано перед удалением

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

Решение 2

Избегайте всех хлопот сиротских ветвей. Создайте два независимых репозитория и отправьте их на один и тот же пульт. Просто используйте разные имена филиалов для каждого репо.

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2
Джейкоб Подземные воды
источник
Большое спасибо, что должен быть в состоянии решить мою проблему. На самом деле, два решения используют ветки для разных проектов.
Стоуни
6
Я не уверен, что понимаю решение 2. Вы говорите, что делаете все файлы .git в мастер-репозитории? Чем отличается использование нескольких потерянных веток от нескольких?
Нейт,
14
@Nate Он говорит следующее: создайте два отдельных локальных репозитория, а затем отправьте их обоих в один и тот же удаленный репозиторий на GitHub.
Парень со шляпой
1
Спасибо @TheGuywithTheElfHat. Теперь, когда я смотрю на это снова (9 месяцев спустя), мне это кажется ясным. Решение 2 по-прежнему создает осиротевшие ветви, но я вижу, как с этим методом легче справиться.
конец
21
Решение 2 нуждается в дополнительном объяснении
eC Droid
19

Решение 3

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

Запустите все проекты из одного подтвержденного пустого каталога

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

Однако вот план. Начните так, как вам следует запустить любые проекты git, зафиксировав пустой репозиторий, а затем запустите все ваши проекты из того же состояния пустого каталога. Таким образом, вы уверены, что две партии файлов довольно независимы. Кроме того, дайте своим веткам правильное имя и не лениво просто использовать «мастер». Ваши проекты должны быть отдельными, поэтому дайте им соответствующие имена.

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

Создать пустой репозиторий

cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY

Начните свои проекты с нуля.

Работа над одним проектом.

git branch software EMPTY
git checkout software
echo "array board[8,8] of piece" > chess.prog

git add chess.prog 
git commit -m "chess program"

Начать другой проект

всякий раз, когда вам нравится.

git branch thesis EMPTY
git checkout thesis
echo "the meaning of meaning" > philosophy_doctorate.txt
git add philosophy_doctorate.txt 
git commit -m "Ph.D"

Переключаться назад и вперед

Возвращайтесь назад и вперед между проектами, когда захотите. Этот пример восходит к шахматному программному проекту.

git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog 
git commit -m "improved chess program"

Неотслеживаемые файлы раздражают

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

touch untracked_software_file.prog
git checkout thesis 
ls
    philosophy_doctorate.txt  untracked_software_file.prog

Это не непреодолимая проблема

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

git checkout EMPTY 
ls
    untracked_software_file.prog
rm -r *
    (directory is now really empty, apart from the repository stuff!)
git checkout thesis
ls
    philosophy_doctorate.txt

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

Изысканность

$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty

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

пример

# Create thesis repository. 
# Merge existing chess repository branch into it

mkdir single_repo_for_thesis_and_chess
cd single_repo_for_thesis_and_chess
git init
touch .gitignore
git add .gitignore
GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01:T01:01:01' git commit -m empty
git tag EMPTY
echo "the meaning of meaning" > thesis.txt
git add thesis.txt
git commit -m "Wrote my PH.D"
git branch -m master thesis

# It's as simple as this ...
git remote add chess ../chessrepository/.git
git fetch chess chess:chess

результат

Схема объединенных хранилищ

Использовать подкаталоги для каждого проекта?

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

chess.prog
philosophy_doctorate.txt 

иметь

chess/chess.prog
thesis/philosophy_doctorate.txt 

В этом случае ваш неотслеживаемый файл программного обеспечения будет chess/untracked_software_file.prog. При работе в thesisкаталоге вас не должны беспокоить неотслеживаемые файлы шахматных программ, и вы можете встретить случаи, когда вы сможете работать счастливо, не удаляя неотслеживаемые файлы из других проектов.

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

Имена ветвей могут включать символы '/'

Таким образом, вы можете назвать ваши ветви как

project1/master
project1/featureABC
project2/master
project2/featureXYZ
Иван
источник
9

Я бы использовал git submodules.

посмотрите здесь Git-репозиторий в Git-репозитории

По состоянию на февраль2019 года я бы предложил Monorepos

Hitmands
источник
5
«У меня есть только один репозиторий». Не могли бы вы объяснить, как хранить несколько подмодулей в одном репозитории?
Иван
4
git submodule add [url to git repo]- git-scm.com/book/en/v2/Git-Tools-Submodules
prasanthv
3
Не могли бы вы объяснить, почему «Монорепос»?
Софиевда