Яка найкраща практика для розміщення декількох проектів у сховищі 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

Підсумок, як
показано

Відповіді:


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 у master git repo? Що відрізняється від використання кількох осиротілих гілок проти використання декількох гілок?
Нейт

14
@Nate Що він говорить, це таке: зробіть два окремі локальні сховища, а потім перемістіть їх обох у той самий віддалений сховище на GitHub.
Хлопець з капелюхом

1
Спасибі @TheGuywithTheElfHat. Тепер, коли я знову дивлюся на це (через 9 місяців), мені здається зрозумілим. Рішення 2 все ще створює осиротілі гілки, але я бачу, як з цим методом легше боротися.
Нейт

21
Рішення 2 потребує додаткового пояснення
eC Droid

19

Рішення 3

Це для використання єдиного каталогу для декількох проектів. Я використовую цю техніку для деяких тісно пов'язаних проектів, де мені часто потрібно перетягувати зміни з одного проекту в інший. Це схоже на ідею осиротілих гілок, але гілки не потребують осиротіння. Просто запустіть усі проекти з одного і того ж стану порожнього каталогу.

Почніть всі проекти з одного довіреного порожнього каталогу

Не чекайте чудес від цього рішення. Як я бачу, у вас завжди будуть дратуватися файли, що не відслідковуються. Git насправді не має поняття, що з ними робити, тому, якщо є проміжні файли, згенеровані компілятором і проігноровані вашим файлом .gitignore, цілком ймовірно, що вони будуть вивішені деякий час, якщо ви спробуєте швидко замінити між - наприклад, - вашим програмним проектом та проектом дисертації PH.D.

Однак ось план. Почніть так, як вам слід запустити будь-які git-проекти, зробивши порожнє сховище, а потім запустіть усі ваші проекти з того ж стану порожнього каталогу. Таким чином ви впевнені, що два файли є досить незалежними. Крім того, дайте своїм гілкам належну назву і не лінуйтеся просто використовувати "майстер". Ваші проекти повинні бути окремими, тому дайте їм відповідні назви.

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


5
"У мене є лише одне сховище." Чи хотіли б ви пояснити, як ви зберігатимете кілька підмодулів в одному сховищі?
Іван

4
git submodule add [url to git repo]- git-scm.com/book/en/v2/Git-Tools-Submodules
prasanthv

3
Чи можете ви пояснити, чому "Монорепос"?
sophievda
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.