суббота, 9 февраля 2013 г.

Git, извлекаем данные из удаленного репозитория в непустой каталог

Мы работаем над довольно большим програмным продуктом весь исходный код которого хранится под SVN. Полная сборка всего приложения с использование IncrediBuild занимает 2 часа. Часто после очередного апдейта, если кто-то изменил что-то в одной из базовых библиотек приходится тратить слишком много времени на то, что все заново собрать. Поскольку наша команда работает только над небольшой частью продукта, мы решили использовать Git для того, что обмениваться кодом между собой без необходимости подтягивать изменения от других команд каждый раз - все что нужно, это время от времени синхронизироваться с SVN. Мы установили свой Git сервер и внесли в репозиторий только нужные нам проекты, отправив все остальные в игнор. Однако столкнулись со следующим затруднением. Когда кто-нибудь из наших разработчиков пытается извлесь файлы из Git в папку где лежат исходники извлеченные из SVN, используюя git init & git remote add + git pull, Git ругается на то, что такие файлы уже существуют в целевом каталоге и отказывается извлечь их.

error: Untracked working tree file 'file_name' would be overwritten by merge.

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

git init
git remote add <remote_repo>
git fetch <remote_repo> <branch>
git reset --hard FETCH_HEAD