Возникла задачка. Есть у меня основной проект, в корне которого как положено .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.
Хоть и через Ж.Вот, кстати, ради чего все старания.
А еще с днем меня рождения. Теперь буду байку рассказывать на тренингах, что ДР встретил за кодингом любимого проекта. А у тебя как ночь перед днем рождения обычно проходит?
Чтож ты делаешь!!!! День рождения это не повод издеваться над git!
ОтветитьУдалитьДля этого есть команда, в которую ты передаешь фильтр (и .gitignore) и она тебе сохранит всю историю:
https://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html
PS: с днем рождения
С Днем Рождения, СанЁк!
ОтветитьУдалитьТвое решение попахивает велосипедом да еще и с квадратными колесами.
Поддерживаю идею посмотреть в сторону git submodules.
С Днём Рождения, СанЁк!!!
ОтветитьУдалитьВсегда интересная движуха на твоём блоге!)
Желаю тебе побольше здравия, сердечности и спокойствия!
Ребята спасибо за поздравления.
ОтветитьУдалитьЯ в начале поста добавил пометку по квадратокосесность :)
Чуть позже порисерчу решение
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
И отрипорчу