Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!


Интересна Java? Кликай по ссылке и изучай!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

понедельник, 13 апреля 2015 г.

Как закоммитить разные части проекта в разные git репозитории?

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

Есть небольшая часть проекта (исходники), которую я бы хотел открыть и выложить на публичном репозитории. Я не хочу заниматься никаким копипастерством этой части исходников в новый проект (с последующим его push в public repo), потому как это чревато провтыками с моей стороны. Я хочу чтобы у меня в одном проекте было два репозитория и я мог коммитить то в один то во второй легко и непринужденно.

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


Проект у меня многомодульный maven. Структура такая:
Codenjoy - корень, тут находится папка .git и файл .gitignore основного репозитория
Codenjoy\CodingDojo - тут находится родительский maven проект, сам он туп, только собирает все проекты в кучу
Codenjoy\CodingDojo\games - тут находятся все проекты-игры (их дофига)
Codenjoy\CodingDojo\games\engine - тут находятся общие для всех игр сырцы - именно их я хочу выложить в паблик
Codenjoy\CodingDojo\games\sample - тут находится пример, как создавать свою игру - это я тоже хочу зашарить.
Codenjoy\CodingDojo\games\game1 - это какая другая игра, которую я не хочу шарить
Codenjoy\CodingDojo\server - тут находится сервер игры, его я тоже не буду шарить

Итак, первая гипотеза заключается в том, чтобы сделать git init в папке Codenjoy\CodingDojo\games и я ее проверил. Более того IDEA даже подхватила его, и после добавления в качестве второго репозитория я даже сделал пару коммитов. Но потом git крешнулся. Как-то он закоммитил один файл в один репозиторий, а описание о коммите, в другой репозиторий. Потому пришлось все сносить и пробовать еще раз. Урок понял - два репозитория одновременно не прокатят, будем их переключать. Но как?

В папке Codenjoy\CodingDojo\games я создал два батника: disable-second-repo.bat
#disable-second-repo.bat
attrib -h .git
ren .git .git_
attrib +h .git_
ren .gitignore .gitignore_
cd..
cd..
attrib -h .git_
ren .git_ .git
attrib +h .git
и enable-second-repo.bat
#enable-second-repo.bat
attrib -h .git_
ren .git_ .git
attrib -h .git
ren .gitignore_ .gitignore
cd..
cd..
attrib -h .git
ren .git .git_
attrib +h .git_
И настроил .gitignore файлы во внутреннем репозитории
/game1/**
/engine/src/**
/engine/target/**
/engine/.idea/**
/engine/*.iml
/sample/target/**
/sample/.idea/**
/sample/*.iml
/*.bat
и внешнем (основном)
/CodingDojo/games/.gitignore
/CodingDojo/games/.gitignore_
/CodingDojo/games/.git
/CodingDojo/games/.git_
После добавил два репозитория в IDEA - на время пришлось включить оба. Потом отключил один (переименовав в .git_) и IDEA ругнулась, что один репозиторий отвалился. Ну ок, игнорим сообщение, жмем Ctrl-F5 на вьюшке Changes и видим то, что уходит на один репозиторий. Коммитим. А в git bash (который запущен из папки Codenjoy\CodingDojo\games) делаем git push. Все ушло! Переключаем репозитории одним из батников. Идем в IDEA. Жмем Ctrl-F5 на вьюшке Changes и видим то, что уходит на второй репозиторий. Коммитим. А в git bash (который запущен все из той же папки Codenjoy\CodingDojo\games) делаем git push. Все ушло! Только теперь в другой репозиторий. Profit.
Хоть и через Ж.
Вот, кстати, ради чего все старания.


А еще с днем меня рождения. Теперь буду байку рассказывать на тренингах, что ДР встретил за кодингом любимого проекта. А у тебя как ночь перед днем рождения обычно проходит? 

4 комментария:

  1. Чтож ты делаешь!!!! День рождения это не повод издеваться над git!

    Для этого есть команда, в которую ты передаешь фильтр (и .gitignore) и она тебе сохранит всю историю:

    https://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html

    PS: с днем рождения

    ОтветитьУдалить
  2. С Днем Рождения, СанЁк!

    Твое решение попахивает велосипедом да еще и с квадратными колесами.
    Поддерживаю идею посмотреть в сторону git submodules.

    ОтветитьУдалить
  3. С Днём Рождения, СанЁк!!!
    Всегда интересная движуха на твоём блоге!)
    Желаю тебе побольше здравия, сердечности и спокойствия!

    ОтветитьУдалить
  4. Ребята спасибо за поздравления.
    Я в начале поста добавил пометку по квадратокосесность :)
    Чуть позже порисерчу решение
    http://stackoverflow.com/questions/17413493/create-a-submodule-repository-from-a-folder-and-keep-its-git-commit-history
    https://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html
    И отрипорчу

    ОтветитьУдалить