Первые шаги в GIT – создаем репозиторий
Цели и задачи: имеем локальную копию проекта и копию на сервере. Хотелось бы объединить все это в общий репозиторий, в результате чего на локальной машине и сервере будет версия этого самого репозитория.
Имеем следующую структуру на рабочем месте:
1 2 3 | с:/www/project/ # корень проекта c:/www/project/data/ # подключаемые библиотеки и все все все c:/www/project/htdocs/ # www root проекта |
Создание репозитория из директории с:/www/project/ :
1 | git init |
Создастся пустой локальный репозиторий с которым можно уже работать. Далее снимаем с него метаданные:
1 | git clone --bare project project.git |
создаётся каталог
project.git
- это и будет публичная (общая) часть репозитория, который нужно слить на сервак в то место, где будут находиться публичные (доступные по ssh) репозитории. Допустим, это будет так:
1 2 | /home/<user>/git # здесь хранятся репозитории /home/%user%/git/project.git # это новый репозиторий |
Tак репозиторий будет доступен снаружи для git-клиентов:
1 | git+ssh://svdev.ru/home/<user>/git/project.git |
На другой машине для получения копии необходимо выполнить:
1 | git clone git+ssh://svdev.ru/home/<user>/git/project.git |
расширение .git отрубится, и в текущем каталоге появится дерево исходников текущей версии.
Что получилось: локальная копия репозитория и публичная. Но репозиторий еще пустой – необходимо добавить в него файлы с локальной версии проекта. Текущее состояние можно посмотреть командой
1 | git status |
Получаем:
1 2 3 4 5 6 7 8 9 10 11 | # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # data/ # htdocs/ # logs/ nothing added to commit but untracked files present (use "git add" to track) |
Но директория
logs
нам в репозитории не нужна, поэтому добавим её в игнорируемы, что бы лишний раз глаза не мозолила. http://book.git-scm.com/4_ignoring_files.html или http://www.kernel.org/pub/software/scm/git/docs/gitignore.html – здесь подробнее про
.gitignore
, а если в двух словах, то создаем в корне репозитория файл
.gitignore
следующего содержания:
1 | logs |
Каждая строка здесь – это шаблон для файлов от корня директории, в которой расположен
.gitignore
Добавляем
data
и
htdocs
1 | git add htdocs data |
Далее как в старом добром SVN делаем комит
1 | git commit -m "Initial commit" |
Хочу заметить, так же, что в отличие от SVN здесь не нужна никакая дополнительная структура – весь функционал (и намного больший) реализуется без нашего участия.
Еще одно небольшое отличие… Куда мы закомитили изменения? В локальный репозиторий! Подробнее про коммиты и работу с публичными репозиториями можно почитать здесь: http://book.git-scm.com/3_distributed_workflows.html. Сначала надо «сообщить» где у нас находится публичный репозиторий в который мы собираемся сливать все изменения и откуда в дальнейшем будем обновлять версию на сервере. Делается это при помощи
git config
:
1 2 | git config remote.origin.url "git+ssh://<user>@svdev.ru/home/<user>/project.git" # здесь origin - это короткое имя для репозитория |
Теперь можно выкладывать наши изменения в общий репозиторий:
1 2 3 | git push origin master # origin - это короткое имя для репозитория, которое мы задали в предыдущем шаге # master - это имя ветки (об этом позже) |
Теперь у нас есть публичный репозиторий и локальный – который знает о внешнем. Осталось сделать копию репозитория на рабочем сервере. В моем случае – сервер где хранятся публичные репозитории и где запущены сами проекты один и тот же, поэтому получать будем из локальной директории:
1 2 3 4 5 | cd /var/www git clone /home/<user>/git/project.git ./project # в дальнейшем можно будет обновлятся так: cd /var/www/project git pull origin master |
Май 23rd, 2009 at 22:08
А надо ли добавлять .gitignore в репозиторий? На мой взгляд, в репозитории не должно быть упоминания файлов, которых не должно быть в репозитории
Кроме того, файлы, которые игнорируются, обычно индивидуальны. Один разработчик использует одну IDE, другой – другую, которая генерит другие временные или «проекто-зависимые» файлы и директории. А всё индивидуальное, опять же, не следует помещать в общий репозиторий.
Я недавно начал git осваивать, так что это не вежливый совет в форме вопроса, а действительно вопрос
На данный момент я в .gitignore прописал первой строчкой: .gitignore (т.е. игнорить файл игнорирования). И это работает. Меня просто несколько смущает, что подход такой, видимо, не слишком популярен – никаких упоминаний пока не нашёл.
Май 25th, 2009 at 11:06
Согласен. Весчь сугубо индивидуальная и в репозитории она не нужна.
Вот еще здесь основы разложены: http://los-t.livejournal.com/tag/git+guts (на русском)
Август 19th, 2009 at 17:43
Если проект при запуске генерирует что-нибудь в диры с проектом, например nohup.out, *.log, target/, *.ipr и т.д. и т.п., то соответствующий .gitignore _должен_ быть в репо.
Август 19th, 2009 at 18:14
В принципе возможен такой вариант, что в репозиторий кладется .gitignore с прописанными там основными вещами для проекта, как то файл конфига или директории для аплоадов, а уже после того как разработчик получает себе рабочую копию и вместе с ней .gitignore с основными вещами добавляет туда вещи индивидуальные для себя, к примеру эклипсовские файлы и директории:
.cache
.project
.settings
и в довершение сам .gitignore
Август 20th, 2009 at 11:42
Да.
Надо игнорить и то и другое. Можно превентивно.
Совершенно верно. Но надо помнить, что репозиторий это не образ «боевой» системы, а образ окружения разработчика. Для разработчика .gitignore не лишний.
Кроме того, .gitignore удобно использовать в качестве placeholder’а для распространения пустых каталогов. См. http://git.or.cz/gitwiki/GitFaq#CanIaddemptydirectories.3F
Декабрь 26th, 2009 at 22:19
а как добавить в .gitignore внутреннюю папку?!
Декабрь 26th, 2009 at 23:45
Допустим корень проекта:
/var/www/svdevа добавить в игнор надо директорию/var/www/svdev/src/user/www/uploadТо в файл
.gitignoreнадо прописать путь от корня проекта:Так же можно использвать регулярные выражения, к примеру есть несколько файлов конфига – один для локальной версии (
/var/www/svdev/config.php), друго – выкладывается на продакшн (/var/www/svdev/config-work.php), тогда можно заигноить следующим образом:Январь 11th, 2010 at 14:47
Какой-то бок с .gitignore. Прописал config.php, положил в корень, сделал изменения в config.php и все равно его видно в списке после git status, что за муйня?
Январь 11th, 2010 at 18:10
Я так понимаю config.php уже был в репозитории? Если да – то необходимо его удалить и дальнейшие изменения отслеживаться не будут:
Таким образом удалится файл из репозитория не трогая рабочую область.
Февраль 3rd, 2011 at 15:17
А подскажите как можно синхронизировать два локальных репозитория. Есть две машины с виндой. Репозиторий в расшаренной папке на одной из них. Так вот как его скопировать на другую машину и как потом синхронизировать?
Февраль 3rd, 2011 at 17:56
Если под двумя репозиториями имеется ввиду одна рабочая копия, а второй – это публичный репозиторий, то можно или просто тупо скопировать все файлы из расшаренной папки в новое место, а в рабочем репозитории изменить путь к публичной части отредактировав файл
.git/configили командой$ git config remote.origin.url "\\192.168.0.101\git\newpath.git"