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
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^
# восстановить файл main.cpp из коммита 965ee26 git checkout 965ee26 -- main.cpp
# сделать "обратный" коммит 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"
git stash git checkout some-branch git stash pop
Вариант №1 рекомендаций по именованию коммитов (ссылка):
<type> <description>
Fix | коммит, который устраняет баг |
Feat | коммит, который содержит новый функционал |
Chore | коммит, который не устраняет баг и не вносит новый функционал, а модифицирует или обновляет зависимости |
Refactor | этот коммит содержит рефакторинг, который включает рефакторинг кода или изменения |
Docs | этот коммит изменяет документацию, readme.md или markdown файлы |
Style | коммит, который вносит изменения в оформление кода |
Test | коммит, который изменяет тестовый файл, включая изменения |
Perf | коммит, в котором улучшается производительность |
Ci | коммит, в котором содержатся изменения в интеграции CI в файлах или скриптах |
Build | это файлы, которые включают файлы сборки и зависимости |
Revert | коммит, который сигнализирует об откате к предыдущему коммиту |
Вариант №2 (ссылка)
git branch new_branch # создание новой ветки от последнего коммита git checkout new_branch # переключение на новую ветку
# переход на ветку в которую будут сливаться изменения git сheckout master # вливание devel_branch в текущую (master) ветку git merge devel_branch
git branch -a
git branch -d local_branch
git push server :remote_branch
git branch -m <newname>
git branch -m <oldname> <newname>
git push origin -u <newname>
git push origin --delete <oldname>
# вытянуть удалённую ветку в локальную 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 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 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 -a vX.Y -m "Project version X.Y"
git tag vX.Y
git tag
git show --no-patch tag_name
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
По-умолчанию в debian'е интерфейс vimdiff представлен тремя буферами:
LOCAL (1) | MERGED (2) | REMOTE (3) |
Подсказка Выяснить, какую функцию несёт, конкретный буфер можно по имени файла, в строке статуса vim'а. Общий формат подписи следующий: filename.LOCAL|REMOTE|BASE.id, где
Основные команды
После приведения буфера MERGED в удовлетворяющий требованиям вид, сохраняем его, выходим из vimdiff'а. Дальнейшие действия (создание коммита), согласно выводу команды:
git status
Сервер (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
Поскольку в качестве системы выбран 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-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:
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 в соответствующем репозитории.
Клонирование репозитория настроек gitolite
git clone ssh://gitolite3@git.jurik-phys.net:1010/gitolite-admin
Редактирование файла gitolite.conf
vim gitolite-admin/conf/gitolite.conf
Добавление проекта в виде:
repo project_groups/project_name RW+ = username config gitweb.owner = Project Owner Name config gitweb.description = Description of project config gitweb.category = Description of project category
Перед созданием коммита c новыми изменениями рекомендуется посмотреть лог предыдущих изменений с целью единообразного описания
git log
Фиксация изменений репозитория gitolite-admin
git add . git commit
Отправка изменений на сервер
git push
Проверка обновлённого списка проектов
ssh -p 1010 gitolite3@git.jurik-phys.net
При правильной настройке cgit новый проект должен появиться в списке доступных в web-интерфейсе
Начало работы с пустым репозиторием
git clone ssh://gitolite3@git.jurik-phys.net:1010/project_groups/project_name
apt-get install cgit
На основе данного материала.
usermod --append --groups gitolite3 www-data
UMASK => 0027
Подробнее про umask по ссылке.
chmod g+rX /var/lib/gitolite3 chmod -R g+rX /var/lib/gitolite3/repositories
su -s /bin/sh www-data $ ls /var/lib/gitolite3/repositories/ ls: невозможно открыть каталог /var/lib/gitolite3/repositories/: ...
то помочь исправить ситуацию должен ход конём:
chown -R gitolite3:www-data /var/lib/gitolite3/repositories/
chmod g+s /var/lib/gitolite3/repositories/
По-умолчанию, модуль 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 необходимо перезапустить браузер. Без этого произошедшие изменения в браузере не изменяются.
В настройках по-умолчанию git-репозиторий распологается по адресу www.mydomen.com/cgit, что не подходит для случая git.mydomen.com, поэтому эти настройки необходимо отключить:
rm /etc/apache2/conf-enabled/cgit.conf
Файл /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.
Файл /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
Всё должно работать.
В каталог /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 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/ - должно автоматически подхватиться для всех пользователей.
Данный модуль может быть не установлен. Тогда, либо установка из репозитория, либо согласно инструкции.
Он может быть установлен, но не «активирован» на выполнение
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 branch BR-NAME
git branch
...
BR-NAME
...
git checkout BR-NAME
git checkout -b BR-NAME
▸ Создание удалённой ветки
▾ Создание удалённой ветки
git checkout -b BR-NAME
git commit -a
git push -u origin BR-NAME
▸ Подключение подпроекта через submodule
▾ Подключение подпроекта через submodule
lab_os/verify/ext/MicroTeX
git submodule add git@github.com:NanoMichael/MicroTeX.git lab_os/verify/ext/MicroTeX
git submodule update --init --recursive
cd lab_os/verify/ext/MicroTeX
git checkout openmath
cd ../../../..
git commit -a
git push
▸ Переключение текущей ветки
▾ Переключение текущей ветки
git branch
git checkout BRANCH_NAME
▸ Влить отдельный коммит в текущую ветку
▾ Влить отдельный коммит в текущую ветку
git cherry-pick commit_sha~1
▸ Переход к предыдущему коммиту
▾ Переход к предыдущему коммиту
git checkout commit_sha~1
git branch new_branch
git checkout branch new_branch
▸ Откатить изменения к последнему коммиту
▾ Откатить изменения к последнему коммиту
git reset --hard HEAD
Для работы с сервисом GitHub через терминал по протоколу SSH необходимо один раз сгенерировать ключи шифрования и публичный добавить в аккаунт в раздел «Settings→SSH and GPG keys».
Процесс генерации ключей описан по ссылке.
Проверка соединения с github через ssh
ssh -T git@github.com
В первый раз необходимо одобрить подключение в ответ на запрос вида
The authenticity of host 'github.com (IP ADDRESS)' can't be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCBCLviKw6E5SY8. Are you sure you want to continue connecting (yes/no)?
GitHub использует email адрес для ассоциации отправленных коммитов с аккаунтом GitHub.
Чтобы связать коммиты с аккаунтом GitHub:
git config --global user.email "ваш-github-email@example.com"
После этого GitHub признает Вас, и все новые коммиты будут подписаны вашим аккаунтом со ссылкой на него, а не просто именем. Подробности по ссылке.
Создание пустого репозитория:
git clone git@github.com/USERNAME/REPOSITORY.git
В текущем каталоге появится подкаталог REPOSITORY - это и есть каталог нового проекта.
Создание GitHub репозитория под существующий локальный проект:
git remote add origin git@github.com:USERNAME/REPOSITORY.git
git remote
git push origin --all
git push -u origin main
Переименовать или удалить репозиторий можно на странице:
https://github.com/USERNAME/REPOSITORY/settings
Добавление уже созданного на github'е репозитория
git remote add origin git@github.com:USERNAME/REPOSITORY.git
Клонирование (стороннего) репозитория
git clone git@github.com:USERNAME/REPOSITORY.git