Jurik-Phys.Net

~ Простота и ясность ~

Инструменты пользователя

Инструменты сайта


Боковая панель

Категории

Контакты

Поддержать проект


itechnology:git

Содержание

Git - шпаргалка

Удалённые серверы

Клонирование с git-сервера

git clone user_name@serve_name:/opt/git/project

Создание удалённого репозитория

Инициализация git-репозитория

git init  

Добавление файлов проекта в репозиторий

git add .      

Cоздание первого коммита

git commit -m 'Initial project version'  

Переход на уровень выше и клонирование локального git'а

cd ..
git clone --bare project/ project.git

Копирование bare-реозитория «project.git» на сервер 1)

scp -r project.git user_name@server:/opt/git/

Просмотр удалённых репозиториев

git remote -v

Инспекция удалённого репозитория

git remote show remote_server

Переименование удалённого репозитория

git remote rename old_name new_name

Удаление удалённого репозитория

git remote rm remote_server

Файлы

Проверка состояния файлов

git status

Добавление файлов в индекс

git add filename

Удалние файла

git rm filename # удаление файла из проекта и индекса
git rm --cached filename #удаление файла из индекса

Перемещение файла

git mv filename.old filename.new

Данная команда равносильна

   mv filename.old filename.new
   git rm filename.old
   git add filenam.new

Коммиты

Просмотр различий (diff)

git diff # просмотр не проиндексированных изменений
git diff --staged # проиндексированные изменения (войдут в следующий commit)

Создание коммита

git commit -a  # Ручной ввод комментария

Редактирование последнего коммита

# замещает последний коммит текущим состоянием (хеш другой)
git commit --amend 
# если последний коммит был отправлен на сервер, то 
# необходимо принудительно обновить ветку
git push -f server local_branch:remote_branch  
# eсли участников несколько, то возможны коллизии!
# (не рекомендуется практиковать этот способ  

Откат изменений

# удаление всех коммитов в ветке до commit_sha
# commit_sha - останется последним коммитов в ветке
# изменений в рабчем каталоге не произойдёт.
git reset --soft commit_sha
# удаление и коммитов до commit_sha, и
# откат состояния рабочего каталога до commit_sha
git reset --hard commit_sha
# удалить последний коммит в ветке 
git reset --hard HEAD^

Отменить коммит

# сделать "обратный" коммит
git revert commit_sha

Изменение истории коммитов

# см. подсказки в текст. редакторе
git rebase -i commit_sha~1

Просмотр истории коммитов

Две удобные конструкции, идущие из коробки:

git log --graph --all
git log --pretty=oneline --graph --all

Решение из интернета. Создание алиасов в config файле git'а:

[alias]
lg1 = log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"

Not currently on any branch

git stash
git checkout some-branch
git stash pop

Ветки

Создание локальной ветки

git branch new_branch   # создание новой ветки от последнего коммита
git checkout new_branch  # переключение на новую ветку

Объединение веток

# переход на ветку в которую будут сливаться изменения
git сheckout master
# вливание devel_branch в текущую (master) ветку
git merge devel_branch

Просмотр всех веток, включая удалённые

git branch -a

Удаление ветки

# удаление удалённой ветки
git push server :remote_branch 
# удаление локальной ветки
git branch -d local_branch

Вытянуть удалённую ветку

# вытянуть удалённую ветку в локальную local_branch
git checkout -b local_branch server/remote_branch 
# сокращённая команда:
git checkout --track server/local_branch

Сброс текущей локальной ветки до состояния удалённой

git fetch --all
git reset --hard server_name/branch_name

Отправка текущей ветки на git-сервер

git push remote_server local_branch_name:remote_branch_name

Работа с подпроектом (ПП)

Добавление ПП в проект

Добавление удалённого сервера подпроекта

git remote add second_server user_name@sever_name:/opt/git/sub_project.git

Получение информации по новому подпроекту

git fetch second_server

Помещение подпроекта в отдельную ветку second_project

git checkout -b second_project second_server/master
# master - соответствующее имя удалённой ветки подпроекта

Переключение на ветку базового проекта

# проверка текущей ветки
git branch
git checkout devel

Вытягивание содержимого подпроекта в подкаталог

git read-tree --prefix=second/ -u second_project

Получение последней версии ПП

Переключение на ветку подпроекта и её обновление

git checkout second_project
git pull

Переключение на разрабатываемую ветку базового проекта

git checkout devel

Слияние актуальной кодовой базы подпроекта с текущей версией базового проекта

git merge --squash -s subtree --no-commit second_project

Разрешение возможных конфликтов

git mergetool

Оценка внесённых изменений

git status

Фиксация изменений базового проекта

git commit -a

Отправка локальных изменений на git-сервер ПП

Переключение на ветку подпроекта

git checkout second_project

Оценка различий соответствующих файлов

git diff-tree -p devel

Объединение кодовой базы основного проекта с файлами продпроекта

git merge --squash -s subtree --no-commit devel
# devel - имя разрабатываемой ветки базового проекта

Разрешение конфликтов, если требуется

git mergetool --squash -s subtree --no-commit devel

Фиксация изменений подпроекта

git commit -a

Отправка изменений подпроекта на git-сервер

git push second_server second_project:master
# master - соответствующее имя удалённой ветки подпроекта

Восстановление ПП после клонирования

Отделение каталога в отдельную подветку

git subtree split --prefix=second --branch second_project

Добавление удалённого репозитория подпроекта

git remote add second_server user@server:/opt/git/sub_project.git

Получение информации по удалённому серверу

git fetch second_server

Привязка соответствующих веток: локальной и удалённой

git branch --set-upstream second_project second_server/master

Метки

Создание меток

git tag tag_name

Просмотр меток

git tag

Отправка меток на сервер

git push origin --tags

Разрешение конфликтов

Настройка инструментов

# установка vimdiff в качестве инструмента разрешения конфликтов
git config --global merge.tool vimdiff
# не создавать *.orig файлов 
git config --globasl mergetool.keepBackup false

Появление конфликта слияния

# установка текущей ветки (master)
git checkout master
# вливание ветки develop в master: конфликт объединения
git merge develop
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
git config --globasl mergetool.keepBackup false

Можно посмотреть детали конфликта:

git status
index.html: needs merge
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   unmerged:   index.html
#

Запуск процесса разрешения конфликтов

git mergetool

Описание vimdiff

По-умолчанию в debian'е интерфейс vimdiff представлен тремя буферами:

LOCAL (1) MERGED (2) REMOTE (3)
  • LOCAL показывает состояние файла в текущей/[local] ветке, в которую вливают код.
  • REMOTE показывает состояние файла во вливаемой[remote] ветке.
  • MERGED - результат объединения, который будет сохранён в репозитории.
  • BASE - временный файл, отображающий общую базу для объединения, позволяет оценить взаимное отличие local и remote файлов. В моей конфигурации его нет, а на нет и суда нет.

Подсказка Выяснить, какую функцию несёт, конкретный буфер можно по имени файла, в строке статуса vim'а. Общий формат подписи следующий: filename.LOCAL|REMOTE|BASE.id, где

  • filename - имя файла, в котором возник конфликт объединения,
  • LOCAL|REMOTE|BASE - роль данного буфера,
  • id - служебный цифровой идентификатор. MERGED буфер отличается тем, что в строке статуса имеет просто: filename.

Основные команды

  • :diffget LO - получить в текущий буфер (MERGED) версию из локальной(LOCAL) версии файла;
  • :diffget RE - получить в текущий буфер (MERGED) версию из вливаемой(REMOTE) версии файла;
  • :ls - посмотреть список буферов;
  • Ctrl + w - перемещение между буферами;
  • ]c - переключиться на следующий конфликтный блок;
  • - переключиться на предыдущий конфликтный блок;

Завершение процесса разрешения конфликта

После приведения буфера MERGED в удовлетворяющий требованиям вид, сохраняем его, выходим из vimdiff'а. Дальнейшие действия (создание коммита), согласно выводу команды:

git status

Настройка git на VDS

Исходные данные

Сервер (VDS) с будущим хранилищем git-репозиториев c каталогом хранения репозиториев

/mnt/srv.misc/git.repos

Данный каталог экспортируется через nfs-сервер. Запись в файле /etc/exports:

# Git repository for Git.Server
/mnt/srv.misc/git.repos/ git(rw,no_root_squash,no_subtree_check,async) 

На сервере в виртуальной машине (KVM) при загрузке происходит монтирование экспортируемого каталога, cогласно записи в fstab:

maxwell:/mnt/srv.misc/git.repos/  /var/lib/gitolite3/repositories nfs  rw,async,hard  0 0

Установка gitolite

Поскольку в качестве системы выбран Debian, то будет правильным устанавливать всё из пакетов.

apt-get install gitolite3

На данном этапе необходимо в виртуальную машину скопировать публичный ключ того пользователя, который будет администрировать git-репозиторий.

Дополнительные настройки пакета можно покрутить через:

dpkg-reconfigure gitolite3

Порт ssh в виртуальной машине изменён с 22 на 1010 в /etc/ssh/sshd_config для того, чтобы на VDS можно было настроить проброс 1010-ого порта виртуальную машину (/etc/firehol/firehol.conf):

 # *) GIT SERVER: WAN ==>> Git Server  (Port Forward)
      EXT_IF=eth0
      EXT_IP=46.160.39.181 # External IP
 
      INT_NAME=git
      INT_IP=`host $INT_NAME | awk '{ print $4 }'` # Internal IP
 
      EXT_PORT=1010
      INT_PORT=1010
         # 1010 [tcp]
         iptables -t nat -A PREROUTING -p tcp -d $EXT_IP --dport $EXT_PORT -j DNAT --to-destination $INT_IP:$INT_PORT
         iptables -A FORWARD -i $EXT_IF -d $INT_IP -p tcp --dport $INT_PORT -j ACCEPT
         # 1010 [udp]
         iptables -t nat -A PREROUTING -p udp -d $EXT_IP --dport $EXT_PORT -j DNAT --to-destination $INT_IP:$INT_PORT
         iptables -A FORWARD -i $EXT_IF -d $INT_IP -p udp --dport $INT_PORT -j ACCEPT

Администрирование gitolite

Администрирование производится в локальном репозитории gitolite-admin с последующим push'ем настроек на сервер, которые сразу после этого начинают действовать.

git clone ssh://gitolite3@git.jurik-phys.net:1010/gitolite-admin

Добавление пользователя состоит в том, чтобы скопировать публичный ключ username.pub пользователя username в каталог keydir и внести его в группу пользователей или произвести другие манипуляции в файле ./conf/gitolite.conf.

Генерация публичного ключа командой ssh-keygen -t rsa от пользователя username.

Создание нового проекта заключается в добавлении записи в gitolite.conf:

repo superproject
    RW+      =      username

Протестировать работоспособность репозитория можно выполнив команду:

ssh -p 1010 gitolite3@git.jurik-phys.net

В результате при правильной настройке можно увидеть список доступных репозиториев.

Проблема. Похоже, что при создании нового репозитория через gitolite.conf из gitolite-admin, затирается файл projects.list. В итоге, cgit, читающий список репозториев с данного файла не находит ни одного репозитория. В качестве временного решения, можно добавить репозитории в projects.list вручную.

Причина проблемы. Gitolite v.3 по-умолчанию не добавляет проекты в project.list. Для того, чтобы они там появились необходимо установить соответствующие настройки репозитория в gitolite-admin/conf/gitoliteconf:

  • Установить права на чтение для зарезервированного пользователя gitweb
    repo    foo bar baz
        R   =   gitweb
  • Прописать хотя бы одну настройку для репозитория:
    config gitweb.owner         =   owner name
    config gitweb.description   =   some description
    config gitweb.category      =   some category

    В этом случае, необходимо отредактировать на сервере файл .gitolite.rc:

    GIT_CONFIG_KEYS => 'gitweb\.(owner|description|category)',

    В настройких cgit /etc/cgitrc до опции scan-path прописать

    enable-git-config=1

    В случае ошибки в web-интерфейсе смотреть логи apach'а. Скорее всего проблемы с правами доступа к файлу config в соответствующем репозитории.

Источники раз, два

Настройка cgit

Установка пакета cgit

apt-get install cgit

Установка прав доступа к репозиторию

На основе данного материала.

  • Добавление пользователя www-datа в группу gitolite3:
    usermod --append --groups gitolite3 www-data
  • Изменение разрешений для будущих репозиториев /var/lib/gitolite3/.gitolite3.rc:
    UMASK => 0027

    Подробнее про umask по ссылке.

  • Изменение прав доступа существующих каталогов:
    chmod g+rX /var/lib/gitolite3
    chmod -R g+rX /var/lib/gitolite3/repositories
  • Если на данном этапе доступа к git-репозиторию нет
    su -s /bin/sh www-data
    $ ls /var/lib/gitolite3/repositories/
    ls: невозможно открыть каталог /var/lib/gitolite3/repositories/: ...

    то помочь исправить ситуацию должен ход конём:

    • Установка для /var/lib/gitolite3/repositories/ группы www-data:
      chown -R gitolite3:www-data /var/lib/gitolite3/repositories/
    • Установка SGID (Set Group Identifier) для каталога /var/lib/gitolite3/repositories/:
      chmod g+s /var/lib/gitolite3/repositories/

Включение cgi в apache

По-умолчанию, модуль cgi выключен. Для включение необходимо выполнить:

a2dismod mpm_event
a2enmod mpm_prefork
service apache2 restart
a2enmod cgi

Enabling module cgi.
To activate the new configuration, you need to run:
service apache2 restart

Важно! После включения модуля cgi необходимо перезапустить браузер. Без этого произошедшие изменения в браузере не изменяются.

Настройка VirtualHost

Удаление настроек пакета cgit

В настройках по-умолчанию git-репозиторий распологается по адресу www.mydomen.com/cgit, что не подходит для случая git.mydomen.com, поэтому эти настройки необходимо отключить:

rm /etc/apache2/conf-enabled/cgit.conf
Добавление сайта git.jurik-phys.net:80

Файл /etc/apache2/sites-available/git.jurik-phys.net.conf:

<VirtualHost *:80>
        ServerAdmin  admin@jurik-phys.net
        ServerAlias  git.jurik-phys.net
        DocumentRoot "/usr/lib/cgit/"
   
        Redirect permanent / https://git.jurik-phys.net

        <Directory "/usr/lib/cgit/">                 
                AllowOverride None
                Options +ExecCGI 
                Require all granted
        </Directory>

        Alias       /cgit-css/  "/usr/share/cgit/"
        ScriptAlias /           "/usr/lib/cgit/cgit.cgi/"

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel error

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Основная задача - перенаправление запросов на https версию cgit.

Добавление сайта git.jurik-phys.net:443

Файл /etc/apache2/sites-available/git.jurik-phys.net-ssl.conf:

<VirtualHost *:443>
        ServerAdmin admin@jurik-phys.net
        ServerAlias git.jurik-phys.net                                       
        DocumentRoot "/usr/lib/cgit/"
   
        SSLEngine on
        SSLCertificateFile    /etc/ssl/crt/jurik-phys.net.crt
        SSLCertificateKeyFile /etc/ssl/key/jurik-phys.net.key
        SSLCACertificateFile  /etc/ssl/ca-certs.pem
                
        <Directory "/usr/lib/cgit/">
                AllowOverride None
                Options +ExecCGI 
                Require all granted
        </Directory>
        
        Alias       /cgit-css/  "/usr/share/cgit/"
        ScriptAlias /           "/usr/lib/cgit/cgit.cgi/"

        ErrorLog ${APACHE_LOG_DIR}/error-ssl.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel error

        CustomLog ${APACHE_LOG_DIR}/access-ssl.log combined
</VirtualHost>

Включение модуля SSL в apache'е для предотвращения ошибки «Invalid command 'SSLEngine'»: Включение сайтов:

a2ensite git.jurik-phys.net-ssl
a2ensite git.jurik-phys.net
a2enmod ssl

Перегрузка конфигурации apache2:

service apache2 reload

Всё должно работать.

Установка пароля на git.jurik-phys.net

В каталог /usr/lib/cgit/ положить файл .htaccess следующего содержания

AuthName "Some message for users"
AuthType Basic  
Require valid-user
AuthUserFile "/opt/git.jurik-phys.net/.htpasswd"

.htpasswd создаётся с помощью утилиты htpasswd из комплекта Apache

htpasswd -bc .htpasswd username password

P.S. также в настройках сайта апача необходимо AllowOverride None заменить на AllowOverride All

Разное

Настройка git

Идентификация пользователя

git config --global user.name "You name"
git config --global user.email "You e-mail"

Кириллица в имени файла

Если файлы с русскими буквами отображаются в виде

#       "\362\345\361\362"

То исправить ситуацию можно, установив параметр quotepath секции [core] конфигурационного файла git ~/.gitconfig в false.

[core]
    quotepath = false

Автодополнение

Положить файл автодополнений .git-completion.bash в домашний каталог и добавить в .bashrc source ~/.git-completion.bash. Или положить этот же файл (если он там уже не лежит) в /etc/bash_completion.d/ - должно автоматически подхватиться для всех пользователей.

Subtree

Данный модуль может быть не установлен. Тогда, либо установка из репозитория, либо согласно инструкции.

Он может быть установлен, но не «активирован» на выполнение

chmod +x /usr/share/doc/git/contrib/subtree/git-subtree.sh
ln -s /usr/share/doc/git/contrib/subtree/git-subtree.sh /usr/lib/git-core/git-subtree

Временное сокрытие изменений

git stash # теперь можно сменить ветку 
           # и продолжить работу в ней
# применить скрытые изменения и удалить "заначку"
git stash pop 

Сборка мусора в базе

git gc
git count-objects -v

Дополнительные материалы git

1)
На серевере должен быть настроен ssh-доступ по ключу для user_name, разрешена запись в /opt/git
itechnology/git.txt · Последние изменения: 2016/09/25 12:10 — jurik_phys

Инструменты страницы