заметки на полях

Блокнот разработчика

Первые шаги в 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

Tags:

11 Responses to “Первые шаги в GIT – создаем репозиторий”

  1. beetleinweb Says:

    А надо ли добавлять .gitignore в репозиторий? На мой взгляд, в репозитории не должно быть упоминания файлов, которых не должно быть в репозитории :)

    Кроме того, файлы, которые игнорируются, обычно индивидуальны. Один разработчик использует одну IDE, другой – другую, которая генерит другие временные или «проекто-зависимые» файлы и директории. А всё индивидуальное, опять же, не следует помещать в общий репозиторий.

    Я недавно начал git осваивать, так что это не вежливый совет в форме вопроса, а действительно вопрос :) На данный момент я в .gitignore прописал первой строчкой: .gitignore (т.е. игнорить файл игнорирования). И это работает. Меня просто несколько смущает, что подход такой, видимо, не слишком популярен – никаких упоминаний пока не нашёл.

  2. Дерябин Сергей Says:

    А надо ли добавлять .gitignore в репозиторий?

    Согласен. Весчь сугубо индивидуальная и в репозитории она не нужна.

    Вот еще здесь основы разложены: http://los-t.livejournal.com/tag/git+guts (на русском)

  3. inca Says:

    Если проект при запуске генерирует что-нибудь в диры с проектом, например nohup.out, *.log, target/, *.ipr и т.д. и т.п., то соответствующий .gitignore _должен_ быть в репо.

  4. Дерябин Сергей Says:

    В принципе возможен такой вариант, что в репозиторий кладется .gitignore с прописанными там основными вещами для проекта, как то файл конфига или директории для аплоадов, а уже после того как разработчик получает себе рабочую копию и вместе с ней .gitignore с основными вещами добавляет туда вещи индивидуальные для себя, к примеру эклипсовские файлы и директории:

    .buildpath
    .cache
    .project
    .settings

    и в довершение сам .gitignore

  5. alxrem Says:

    А надо ли добавлять .gitignore в репозиторий?

    Да.

    Один разработчик использует одну IDE, другой – другую,

    Надо игнорить и то и другое. Можно превентивно.

    На мой взгляд, в репозитории не должно быть упоминания файлов, которых не должно быть в репозитории

    Совершенно верно. Но надо помнить, что репозиторий это не образ «боевой» системы, а образ окружения разработчика. Для разработчика .gitignore не лишний.

    Кроме того, .gitignore удобно использовать в качестве placeholder’а для распространения пустых каталогов. См. http://git.or.cz/gitwiki/GitFaq#CanIaddemptydirectories.3F

  6. seocoder Says:

    а как добавить в .gitignore внутреннюю папку?!

  7. Дерябин Сергей Says:

    а как добавить в .gitignore внутреннюю папку?!

    Допустим корень проекта: /var/www/svdev а добавить в игнор надо директорию /var/www/svdev/src/user/www/upload

    То в файл .gitignore надо прописать путь от корня проекта:

    src/user/www/upload

    Так же можно использвать регулярные выражения, к примеру есть несколько файлов конфига – один для локальной версии (/var/www/svdev/config.php), друго – выкладывается на продакшн (/var/www/svdev/config-work.php), тогда можно заигноить следующим образом:

    config*.php
  8. diabolical Says:

    Какой-то бок с .gitignore. Прописал config.php, положил в корень, сделал изменения в config.php и все равно его видно в списке после git status, что за муйня?

  9. Дерябин Сергей Says:

    Я так понимаю config.php уже был в репозитории? Если да – то необходимо его удалить и дальнейшие изменения отслеживаться не будут:

    git rm --cached config.php

    Таким образом удалится файл из репозитория не трогая рабочую область.

  10. decodder Says:

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

  11. Дерябин Сергей Says:

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

    Если под двумя репозиториями имеется ввиду одна рабочая копия, а второй – это публичный репозиторий, то можно или просто тупо скопировать все файлы из расшаренной папки в новое место, а в рабочем репозитории изменить путь к публичной части отредактировав файл .git/config или командой

    # с путем надо поэксперементировать, могу ошибаться
    $ git config remote.origin.url "\\192.168.0.101\git\newpath.git"

Leave a Reply