asciidoc вместо markdown
This commit is contained in:
@@ -0,0 +1 @@
|
||||
{"checksum":"81886ef1b8d31cdb2b865473bbeb2cf9","width":671,"height":550}
|
@@ -0,0 +1 @@
|
||||
{"checksum":"e76d88ee3db613b3f806d8c773281fdc","width":685,"height":363}
|
@@ -0,0 +1,29 @@
|
||||
= Git: автоматическое сохранение в репозиторий
|
||||
:category: Программирование
|
||||
:tags: программирование, git,
|
||||
|
||||
Скрипт https://github.com/elnull/gitwatch[gitwatch] позволяет
|
||||
отслеживать изменения в каталоге с помощью программы `inotifywait` и
|
||||
фиксировать их в репозиторий. Для работы скрипта необходимо установить
|
||||
пакет `inotify-tools`. Если нужно следить за каталогом `/home/user/dir`
|
||||
и записывать историю изменений в `/home/user/repo/dir`, то нужно
|
||||
инициализировать репозиторий:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
git init --bare /home/user/repo/dir
|
||||
----
|
||||
|
||||
добавить шаблоны исключаемых файлов:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
printf '*.[oa]\n*.swp\n*~\n/.git' >> /home/user/repo/dir/info/exclude
|
||||
----
|
||||
|
||||
и запустить скрипт:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
./gitwatch.sh -g /home/user/repo/dir /home/user/dir
|
||||
----
|
@@ -1,27 +0,0 @@
|
||||
---
|
||||
title: "Git: автоматическое сохранение в репозиторий"
|
||||
category: Программирование
|
||||
tags: программирование, git,
|
||||
...
|
||||
|
||||
Скрипт [gitwatch](https://github.com/elnull/gitwatch) позволяет отслеживать
|
||||
изменения в каталоге с помощью программы `inotifywait` и фиксировать их в
|
||||
репозиторий. Для работы скрипта необходимо установить пакет `inotify-tools`.
|
||||
Если нужно следить за каталогом `/home/user/dir` и записывать историю
|
||||
изменений в `/home/user/repo/dir`, то нужно инициализировать репозиторий:
|
||||
|
||||
```sh
|
||||
git init --bare /home/user/repo/dir
|
||||
```
|
||||
|
||||
добавить шаблоны исключаемых файлов:
|
||||
|
||||
```sh
|
||||
printf '*.[oa]\n*.swp\n*~\n/.git' >> /home/user/repo/dir/info/exclude
|
||||
```
|
||||
|
||||
и запустить скрипт:
|
||||
|
||||
```sh
|
||||
./gitwatch.sh -g /home/user/repo/dir /home/user/dir
|
||||
```
|
@@ -1,20 +1,16 @@
|
||||
---
|
||||
title: "Git: замена адреса подмодуля"
|
||||
category: Программирование
|
||||
tags: программирование, git,
|
||||
monofontoptions:
|
||||
- Scale=0.7
|
||||
...
|
||||
= Git: замена адреса подмодуля
|
||||
:category: Программирование
|
||||
:tags: программирование, git,
|
||||
|
||||
Если у подмодуля, находящегося в каталоге `thirdparty/example` нужно
|
||||
заменить адрес синхронизации и имя используемой ветки, то в каталоге
|
||||
с файлом `.gitmodules`, в котором содержится информация об этом подмодуле,
|
||||
заменить адрес синхронизации и имя используемой ветки, то в каталоге с
|
||||
файлом `.gitmodules`, в котором содержится информация об этом подмодуле,
|
||||
нужно выполнить команды:
|
||||
|
||||
```sh
|
||||
[source,sh]
|
||||
----
|
||||
git config --file=.gitmodules submodule.thirdparty/example.url https://github.com/username/ABC.git
|
||||
git config --file=.gitmodules submodule.thirdparty/example.branch new-branch-name
|
||||
git submodule sync --recursive
|
||||
git submodule update --init --recursive --remote
|
||||
```
|
||||
|
||||
----
|
391
wiki/Prog/Git/Git основные команды.adoc
Normal file
391
wiki/Prog/Git/Git основные команды.adoc
Normal file
@@ -0,0 +1,391 @@
|
||||
= Git: основные команды
|
||||
:category: Программирование
|
||||
:tags: программирование, git
|
||||
|
||||
== Ссылки
|
||||
|
||||
* https://githowto.com/ru/changes_not_files[GitHowTo]
|
||||
* https://git-scm.com/book/ru/v2[ProGit]
|
||||
* https://github.com/maxliscia/git-pocket[Git Pocket Guide]
|
||||
|
||||
== Установка
|
||||
|
||||
В Debian/Ubuntu:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
sudo apt-get install git
|
||||
----
|
||||
|
||||
== Термины
|
||||
|
||||
[width="100%",cols="16%,17%,67%",options="header",]
|
||||
|===
|
||||
|Термин |Англ |Определение
|
||||
|Рабочий каталог |working tree, working directory |Набор файлов в
|
||||
текущем каталоге
|
||||
|
||||
|Репозиторий |repository, repo |Контейнер, хранящий историю изменений
|
||||
файлов проекта
|
||||
|
||||
|Индекс |index, staging area |Область между рабочим каталогом и
|
||||
репозиторием, в которой осуществляется подготовка к фиксации
|
||||
|
||||
|SHA-1 |SHA-1 |Уникальный идентификатор, отражающий информацию об
|
||||
истории
|
||||
|
||||
|Ветка |branch |Именованная последовательность в истории изменений
|
||||
|
||||
|Фиксация (коммит) |commit |Набор файлов, записанных в историю
|
||||
одновременно
|
||||
|
||||
|`HEAD` |`HEAD` |Имя ссылки на последнюю фиксацию в текущей ветке
|
||||
|
||||
|Метка |tag |Именованная ссылка на некоторую фиксацию в истории
|
||||
|===
|
||||
|
||||
== Состояния
|
||||
|
||||
Файлы в рабочем каталоге могут отслеживаться системой контроля версий
|
||||
(tracked) или нет (untracked). Отслеживаемые файлы, которые на диаграмме
|
||||
обозначены зелёным фоном, могут быть неизменёнными (unmodified),
|
||||
изменёнными (modified) или подготовленными к фиксации (staged).
|
||||
|
||||
[plantuml]
|
||||
----
|
||||
@startuml
|
||||
participant untracked as "Неотслеживамые\n(untracked)"
|
||||
box "Отслеживаемые"
|
||||
participant staged as "Подготовленные к фиксации\n(staged)" #55FF55
|
||||
participant unmodified as "Неизменённые\n(unmodified)" #99FF99
|
||||
participant modified as "Изменённые\n(modified)" #77FF77
|
||||
end box
|
||||
|
||||
untracked -> staged : git add
|
||||
staged -> unmodified : git commit
|
||||
unmodified -> modified : редактирование
|
||||
modified -> staged : git add
|
||||
modified -> untracked: git rm --cached
|
||||
unmodified -> untracked: git rm --cached
|
||||
staged -> untracked: git rm --cached
|
||||
@enduml
|
||||
----
|
||||
|
||||
Основные команды, осуществляющие взаимодействие между рабочим каталогом,
|
||||
индексом, локальным и удалённым репозиторием, приведены на диаграмме
|
||||
ниже.
|
||||
|
||||
[plantuml]
|
||||
----
|
||||
@startuml
|
||||
participant workspace as "Рабочий каталог\n(working dir)"
|
||||
participant index as "Индекс\n(index)" #77FF77
|
||||
participant local as "Локальный репозиторий\n(local repository)" #FF7777
|
||||
participant remote as "Удалённый репозиторий\n(remote repository)" #7777FF
|
||||
|
||||
workspace -> local : git commit -a
|
||||
workspace -> index : git add (-u)
|
||||
index -> local : git commit
|
||||
local -> remote : git push
|
||||
|
||||
== Обновление с сервера ==
|
||||
|
||||
remote -> workspace : git pull (rebase)
|
||||
remote -> local : fetch
|
||||
|
||||
== Откат изменений ==
|
||||
local -[#red]> workspace : git checkout HEAD
|
||||
index -[#red]> workspace : git checkout
|
||||
|
||||
== Сравнение ==
|
||||
local -[#blue]> workspace : git diff HEAD
|
||||
index -[#blue]> workspace : git diff
|
||||
|
||||
@enduml
|
||||
----
|
||||
|
||||
== Настройка
|
||||
|
||||
[width="100%",cols="16%,38%,46%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git config` |`--global user.name "John Doe"` |Имя текущего
|
||||
пользователя
|
||||
|
||||
|`git config` |`--global user.email "mail@example.com"` |Почта текущего
|
||||
пользователя
|
||||
|
||||
|`git config` |`--list` |Вывод текущей конфигурации
|
||||
|
||||
|`git config` |`--global --list` |Вывод глобальной конфигурации
|
||||
|===
|
||||
|
||||
== Инициализация
|
||||
|
||||
[width="100%",cols="19%,27%,54%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git init` |`<dir>` |Создать пустой репозиторий в каталоге `<dir>`
|
||||
|
||||
|`git clone` |`<giturl>` `<dir>` |Создать в каталоге `<dir>` копию
|
||||
репозитория, находящегося по адресу `<giturl>`
|
||||
|
||||
|`git clone` |`--recursive <giturl>` `<dir>` |Создать в каталоге `<dir>`
|
||||
копию репозитория, находящегося по адресу `<giturl>`, с учётом
|
||||
подмодулей
|
||||
|===
|
||||
|
||||
== Подмодули
|
||||
|
||||
[width="100%",cols="19%,27%,54%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git submodule` |`add <giturl> <dir>` |Добавить в каталог `<dir>`
|
||||
текущего рапозитория подмодуль, находящийся по адресу `<giturl>`
|
||||
|
||||
|`git submodule` |`update --recursive --remote` |Обновить подмодули
|
||||
|
||||
|`git submodule` |`sync --recursive` |Заменить адреса подмодулей на
|
||||
указанные в файле `.gitmodules`
|
||||
|===
|
||||
|
||||
Удаление подмодуля:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
git submodule deinit <path/to/submodule>
|
||||
git rm <path/to/submodule>
|
||||
----
|
||||
|
||||
== Фиксация
|
||||
|
||||
[width="100%",cols="19%,27%,54%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git add` |`<filename>` |Подготовить файл `<filename>` к фиксации
|
||||
|
||||
|
||||
|`git commit` | |Зафиксировать подготовленные файлы
|
||||
|
||||
|`git commit` |`-a` |Зафиксировать все отслеживаемые файлы, которые были
|
||||
изменены
|
||||
|
||||
|`git rm` |`<filename>` |Удалить файл из индекса и рабочего каталога
|
||||
|
||||
|`git rm` |`-f <filename>` |Force deletion of files from disk
|
||||
|
||||
|`git rm` |`--cached <filename>` |Untrack file (without deleting)
|
||||
|===
|
||||
|
||||
== Информация
|
||||
|
||||
[width="100%",cols="20%,20%,60%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git status` |`-s` |Вывод информации о рабочем каталоге в
|
||||
краткой форме
|
||||
|
||||
|`git log` |`--oneline` |Вывод журнала изменений в краткой форме
|
||||
|
||||
|`git ls-files` | |Вывод списка отслеживаемых и подготовленных файлов
|
||||
|===
|
||||
|
||||
== $push branches (see tags for pushing tags)
|
||||
|
||||
[cols=",,",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git push` |`<remotename> <branchname>` |Push branch to remote
|
||||
|`git push` |`<remotename> --all` |Push all branches to remote
|
||||
|`git push` |`--d <remotename> <branchname>` |`--delete` remote branch
|
||||
|===
|
||||
|
||||
== $remote
|
||||
|
||||
* Remote connections are like bookmarks named after remote repos
|
||||
* `git clone` automatically creates a remote connection usually called
|
||||
`origin`
|
||||
|
||||
[width="100%",cols="36%,26%,38%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git remote` |`-v` |List remote repository endpoints
|
||||
|
||||
|`git branch` |`-r` |List remote repository branches
|
||||
|
||||
|`git remote` |`add <name> <url>` |Create namespaced connection to a
|
||||
remote repository
|
||||
|
||||
|`git remote` |`rename <oldname> <newname>` |Rename connection
|
||||
|
||||
|`git remote` |`rm <name>` |Remove connection
|
||||
|
||||
|`git remote` |`add origin <url>` |Set remote origin
|
||||
|===
|
||||
|
||||
Reference: https://git-scm.com/docs/git-remote
|
||||
|
||||
*Remove remote origin:*
|
||||
|
||||
[source,shell]
|
||||
----
|
||||
# Remove `origin` settings from .git/config
|
||||
git remote rm origin
|
||||
|
||||
# Remove `FETCH_HEAD` which still points to remote
|
||||
git rm .git/FETCH_HEAD
|
||||
----
|
||||
|
||||
== $fetch-pull
|
||||
|
||||
[cols=",,",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git fetch` |`<remote>` |Fetch all branches from remote (without merge)
|
||||
|`git fetch` |`<remote> <branch>` |Fetch specific branch
|
||||
|`git merge` |`<remote>/<branch>` |Merge fetched remote
|
||||
|`git pull` |`<remote>` |Fetch and merge in one command
|
||||
|===
|
||||
|
||||
Reference: https://git-scm.com/docs/git-fetch,
|
||||
https://git-scm.com/docs/git-pull
|
||||
|
||||
== $branch
|
||||
|
||||
[cols=",,",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git branch` | |List branches
|
||||
|
||||
|`git branch` |`<branchname>` |Create new branch
|
||||
|
||||
|`git checkout` |`<sha-1>` |Switch to branch, or commit
|
||||
|
||||
|`git branch` |`-m <branchname> <newname>` |Rename branch
|
||||
|
||||
|`git merge` |`<branchname>` |Merge changes from `<branchname>` to
|
||||
current branch
|
||||
|
||||
|`git branch` |`-d <branchname>` |`--delete` branch
|
||||
|===
|
||||
|
||||
Reference: https://git-scm.com/docs/git-branch
|
||||
|
||||
== $diff
|
||||
|
||||
[cols=",,",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git diff` | |Compare *`working directory`* and *`index`*
|
||||
| |`–-cached` |Compare *`index`* and *`latest commit`*
|
||||
| |`HEAD` |Compare *`latest commit`* and *`working directory`*
|
||||
| |`--stat` |Optional short format
|
||||
| |`<sha-1> <sha-1>` |2 points in time to compare
|
||||
| |`<dir> | <file>` |Compare whole directory or limit to file
|
||||
|===
|
||||
|
||||
Reference: https://git-scm.com/docs/git-diff
|
||||
|
||||
*Examples:*
|
||||
|
||||
[source,shell]
|
||||
----
|
||||
## compare changes made to README.md between working tree (default) and latest commit (HEAD)
|
||||
$ git diff --stat HEAD ./path/README.md
|
||||
|
||||
## compare changes made to README.md between 2 specific points in time (e.g. 2 commits)
|
||||
$ git diff --stat a649900 24bdd58 ./path/README.md
|
||||
----
|
||||
|
||||
== $tag
|
||||
|
||||
[width="100%",cols="36%,26%,38%",options="header",]
|
||||
|===
|
||||
|Команда |Ключи |Описание
|
||||
|`git tag` | |List tags
|
||||
|
||||
|`git tag` |`<v1.0.0>` |Create tag, from latest commit, lightweight
|
||||
|
||||
|`git tag` |`-a <v1.0.0> -m "<msg>"` |Create tag, with `--annotate`,
|
||||
from latest commit
|
||||
|
||||
|`git tag` |`-a <v1.0.0> -m "<msg>" <SHA-1>` |Create tag, with
|
||||
`--annotate`, from specific commit
|
||||
|
||||
|`git tag` |`-d <v1.1.0>` |`--delete` tag
|
||||
|
||||
|`git show` |`<v1.0.0>` |Show tag data and message
|
||||
|
||||
|`git checkout` |`<v1.0.0>` |Switch to specific point tag (not editable)
|
||||
|
||||
|`git push` |`<remote> <tag>` |Push specific tag to `<remote>`
|
||||
(recommended)
|
||||
|
||||
|`git push` |`<remote> --tags` |Push all tags to `<remote>` (only if
|
||||
necessary)
|
||||
|===
|
||||
|
||||
Инициализация репозитория в каталоге `dir`:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
git init dir
|
||||
----
|
||||
|
||||
Клонирование репозитория `repo`, принадлежащего пользователю `user`, с
|
||||
сервера `gitlab.2` в каталог `dir`:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
git clone git@gitlab.2:user/repo.git dir
|
||||
----
|
||||
|
||||
Просмотр состояния рабочего каталога и репозитория:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
git status
|
||||
----
|
||||
|
||||
Краткая форма вывода состояния:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
git status -s
|
||||
----
|
||||
|
||||
Добавление файла `README.md` под версионный контроль и подготовка к
|
||||
фиксации:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
git add README.md
|
||||
----
|
||||
|
||||
Удаление файла `README.md` из индекса репозитория:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
git rm --cached README.md
|
||||
----
|
||||
|
||||
Зафиксировать файлы, подготовленные к фиксации:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
git commit
|
||||
----
|
||||
|
||||
Зафиксировать все отслеживаемые файлы, которые были изменены:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
git commit -a
|
||||
----
|
||||
|
||||
Отправить все ветки репозитория на сервер с меткой `origin`:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
git push origin
|
||||
----
|
@@ -1,311 +0,0 @@
|
||||
---
|
||||
title: "Git: основные команды"
|
||||
category: Программирование
|
||||
tags: программирование, git
|
||||
monofontoptions:
|
||||
- Scale=0.8
|
||||
...
|
||||
|
||||
<style type="text/css" rel="stylesheet">
|
||||
table { table-layout: fixed;}
|
||||
</style>
|
||||
|
||||
|
||||
## Ссылки
|
||||
|
||||
* [GitHowTo](https://githowto.com/ru/changes_not_files)
|
||||
* [ProGit](https://git-scm.com/book/ru/v2)
|
||||
* [Git Pocket Guide](https://github.com/maxliscia/git-pocket)
|
||||
|
||||
## Установка
|
||||
|
||||
В Debian/Ubuntu:
|
||||
|
||||
```sh
|
||||
sudo apt-get install git
|
||||
```
|
||||
|
||||
## Термины
|
||||
|
||||
|
||||
| Термин | Англ | Определение |
|
||||
| ------ | ------ | ----------------------- |
|
||||
| Рабочий каталог | working tree, working directory | Набор файлов в текущем каталоге |
|
||||
| Репозиторий | repository, repo | Контейнер, хранящий историю изменений файлов проекта |
|
||||
| Индекс | index, staging area | Область между рабочим каталогом и репозиторием, в которой осуществляется подготовка к фиксации |
|
||||
| SHA-1 | SHA-1 | Уникальный идентификатор, отражающий информацию об истории |
|
||||
| Ветка | branch | Именованная последовательность в истории изменений |
|
||||
| Фиксация (коммит) | commit | Набор файлов, записанных в историю одновременно |
|
||||
| `HEAD` | `HEAD` | Имя ссылки на последнюю фиксацию в текущей ветке |
|
||||
| Метка | tag | Именованная ссылка на некоторую фиксацию в истории |
|
||||
|
||||
|
||||
## Состояния
|
||||
|
||||
Файлы в рабочем каталоге могут отслеживаться системой контроля версий
|
||||
(tracked) или нет (untracked). Отслеживаемые файлы, которые на диаграмме
|
||||
обозначены зелёным фоном, могут быть неизменёнными (unmodified),
|
||||
изменёнными (modified) или подготовленными к фиксации (staged).
|
||||
|
||||
```plantuml
|
||||
@startuml
|
||||
participant untracked as "Неотслеживамые\n(untracked)"
|
||||
box "Отслеживаемые"
|
||||
participant staged as "Подготовленные к фиксации\n(staged)" #55FF55
|
||||
participant unmodified as "Неизменённые\n(unmodified)" #99FF99
|
||||
participant modified as "Изменённые\n(modified)" #77FF77
|
||||
end box
|
||||
|
||||
untracked -> staged : git add
|
||||
staged -> unmodified : git commit
|
||||
unmodified -> modified : редактирование
|
||||
modified -> staged : git add
|
||||
modified -> untracked: git rm --cached
|
||||
unmodified -> untracked: git rm --cached
|
||||
staged -> untracked: git rm --cached
|
||||
@enduml
|
||||
```
|
||||
|
||||
Основные команды, осуществляющие взаимодействие между рабочим каталогом,
|
||||
индексом, локальным и удалённым репозиторием, приведены на диаграмме ниже.
|
||||
|
||||
```plantuml
|
||||
@startuml
|
||||
participant workspace as "Рабочий каталог\n(working dir)"
|
||||
participant index as "Индекс\n(index)" #77FF77
|
||||
participant local as "Локальный репозиторий\n(local repository)" #FF7777
|
||||
participant remote as "Удалённый репозиторий\n(remote repository)" #7777FF
|
||||
|
||||
workspace -> local : git commit -a
|
||||
workspace -> index : git add (-u)
|
||||
index -> local : git commit
|
||||
local -> remote : git push
|
||||
|
||||
== Обновление с сервера ==
|
||||
|
||||
remote -> workspace : git pull (rebase)
|
||||
remote -> local : fetch
|
||||
|
||||
== Откат изменений ==
|
||||
local -[#red]> workspace : git checkout HEAD
|
||||
index -[#red]> workspace : git checkout
|
||||
|
||||
== Сравнение ==
|
||||
local -[#blue]> workspace : git diff HEAD
|
||||
index -[#blue]> workspace : git diff
|
||||
|
||||
@enduml
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Настройка
|
||||
|
||||
| Команда | Ключи | Описание |
|
||||
| ---- | ---------- | ------------ |
|
||||
| `git config` | `--global user.name "John Doe"` | Имя текущего пользователя |
|
||||
| `git config` | `--global user.email "mail@example.com"` | Почта текущего пользователя |
|
||||
| `git config` | `--list` | Вывод текущей конфигурации |
|
||||
| `git config` | `--global --list` | Вывод глобальной конфигурации |
|
||||
|
||||
|
||||
## Инициализация
|
||||
|
||||
| Команда | Ключи | Описание |
|
||||
| ---- | ------ | ------------ |
|
||||
| `git init` | `<dir>` | Создать пустой репозиторий в каталоге `<dir>` |
|
||||
| `git clone` | `<giturl>` `<dir>` | Создать в каталоге `<dir>` копию репозитория, находящегося по адресу `<giturl>` |
|
||||
| `git clone` | `--recursive <giturl>` `<dir>` | Создать в каталоге `<dir>` копию репозитория, находящегося по адресу `<giturl>`, с учётом подмодулей |
|
||||
|
||||
|
||||
## Подмодули
|
||||
|
||||
| Команда | Ключи | Описание |
|
||||
| ---- | ------ | ------------ |
|
||||
| `git submodule` | `add <giturl> <dir>` | Добавить в каталог `<dir>` текущего рапозитория подмодуль, находящийся по адресу `<giturl>` |
|
||||
| `git submodule` | `update --recursive --remote` | Обновить подмодули |
|
||||
| `git submodule` | `sync --recursive` | Заменить адреса подмодулей на указанные в файле `.gitmodules` |
|
||||
|
||||
|
||||
Удаление подмодуля:
|
||||
|
||||
```sh
|
||||
git submodule deinit <path/to/submodule>
|
||||
git rm <path/to/submodule>
|
||||
```
|
||||
|
||||
## Фиксация
|
||||
|
||||
| Команда | Ключи | Описание |
|
||||
| ---- | ------ | ------------ |
|
||||
| `git add` | `<filename>` | Подготовить файл `<filename>` к фиксации |
|
||||
| `git commit` | | Зафиксировать подготовленные файлы |
|
||||
| `git commit` | `-a` | Зафиксировать все отслеживаемые файлы, которые были изменены |
|
||||
| `git rm` | `<filename>` | Удалить файл из индекса и рабочего каталога |
|
||||
| `git rm` | `-f <filename>` | Force deletion of files from disk |
|
||||
| `git rm` | `--cached <filename>` | Untrack file (without deleting) |
|
||||
|
||||
|
||||
## Информация
|
||||
|
||||
| Команда | Ключи | Описание |
|
||||
| ---- | ---- | ------------ |
|
||||
| `git status` | `-s` | Вывод информации о рабочем каталоге в краткой форме |
|
||||
| `git log` | `--oneline` | Вывод журнала изменений в краткой форме |
|
||||
| `git ls-files` | | Вывод списка отслеживаемых и подготовленных файлов |
|
||||
|
||||
|
||||
## $push branches (see tags for pushing tags)
|
||||
|
||||
| Команда | Ключи | Описание |
|
||||
| ---- | ------ | ------------ |
|
||||
| `git push` | `<remotename> <branchname>` | Push branch to remote |
|
||||
| `git push` | `<remotename> --all` | Push all branches to remote |
|
||||
| `git push` | `--d <remotename> <branchname>` | `--delete` remote branch |
|
||||
|
||||
## $remote
|
||||
|
||||
- Remote connections are like bookmarks named after remote repos
|
||||
- `git clone` automatically creates a remote connection usually called `origin`
|
||||
|
||||
| Команда | Ключи | Описание |
|
||||
|---------|-------|----------|
|
||||
| `git remote` | `-v` | List remote repository endpoints |
|
||||
| `git branch` | `-r` | List remote repository branches |
|
||||
| `git remote` | `add <name> <url>` | Create namespaced connection to a remote repository |
|
||||
| `git remote` | `rename <oldname> <newname>` | Rename connection |
|
||||
| `git remote` | `rm <name>` | Remove connection |
|
||||
| `git remote` | `add origin <url>` | Set remote origin |
|
||||
|
||||
Reference: https://git-scm.com/docs/git-remote
|
||||
|
||||
**Remove remote origin:**
|
||||
|
||||
```shell
|
||||
# Remove `origin` settings from .git/config
|
||||
git remote rm origin
|
||||
|
||||
# Remove `FETCH_HEAD` which still points to remote
|
||||
git rm .git/FETCH_HEAD
|
||||
```
|
||||
|
||||
## $fetch-pull
|
||||
|
||||
| Команда | Ключи | Описание |
|
||||
|---------|-------|----------|
|
||||
| `git fetch` | `<remote>` | Fetch all branches from remote (without merge) |
|
||||
| `git fetch` | `<remote> <branch>` | Fetch specific branch |
|
||||
| `git merge` | `<remote>/<branch>` | Merge fetched remote |
|
||||
| `git pull` | `<remote>` | Fetch and merge in one command |
|
||||
|
||||
Reference: https://git-scm.com/docs/git-fetch, https://git-scm.com/docs/git-pull
|
||||
|
||||
|
||||
## $branch
|
||||
|
||||
| Команда | Ключи | Описание |
|
||||
|---------|-------|----------|
|
||||
| `git branch` | | List branches |
|
||||
| `git branch` | `<branchname>` | Create new branch |
|
||||
| `git checkout` | `<sha-1>` | Switch to branch, or commit |
|
||||
| `git branch` | `-m <branchname> <newname>` | Rename branch |
|
||||
| `git merge` | `<branchname>` | Merge changes from `<branchname>` to current branch |
|
||||
| `git branch` | `-d <branchname>` | `--delete` branch |
|
||||
|
||||
Reference: https://git-scm.com/docs/git-branch
|
||||
|
||||
## $diff
|
||||
|
||||
| Команда | Ключи | Описание |
|
||||
|---------|-------|----------|
|
||||
| `git diff` | | Compare **`working directory`** and **`index`** |
|
||||
| | `–-cached` | Compare **`index`** and **`latest commit`** |
|
||||
| | `HEAD` | Compare **`latest commit`** and **`working directory`** |
|
||||
| | `--stat` | Optional short format |
|
||||
| | `<sha-1> <sha-1>` | 2 points in time to compare |
|
||||
| | `<dir> | <file>` | Compare whole directory or limit to file |
|
||||
|
||||
Reference: https://git-scm.com/docs/git-diff
|
||||
|
||||
**Examples:**
|
||||
|
||||
```shell
|
||||
## compare changes made to README.md between working tree (default) and latest commit (HEAD)
|
||||
$ git diff --stat HEAD ./path/README.md
|
||||
|
||||
## compare changes made to README.md between 2 specific points in time (e.g. 2 commits)
|
||||
$ git diff --stat a649900 24bdd58 ./path/README.md
|
||||
```
|
||||
|
||||
## $tag
|
||||
|
||||
| Команда | Ключи | Описание |
|
||||
|---------|-------|----------|
|
||||
| `git tag` | | List tags |
|
||||
| `git tag` | `<v1.0.0>` | Create tag, from latest commit, lightweight |
|
||||
| `git tag` | `-a <v1.0.0> -m "<msg>"` | Create tag, with `--annotate`, from latest commit |
|
||||
| `git tag` | `-a <v1.0.0> -m "<msg>" <SHA-1>` | Create tag, with `--annotate`, from specific commit |
|
||||
| `git tag` | `-d <v1.1.0>` | `--delete` tag |
|
||||
| `git show` | `<v1.0.0>` | Show tag data and message |
|
||||
| `git checkout` | `<v1.0.0>` | Switch to specific point tag (not editable) |
|
||||
| `git push` | `<remote> <tag>` | Push specific tag to `<remote>` (recommended) |
|
||||
| `git push` | `<remote> --tags` | Push all tags to `<remote>` (only if necessary) |
|
||||
|
||||
|
||||
|
||||
|
||||
Инициализация репозитория в каталоге `dir`:
|
||||
|
||||
```sh
|
||||
git init dir
|
||||
```
|
||||
|
||||
Клонирование репозитория `repo`, принадлежащего пользователю `user`,
|
||||
с сервера `gitlab.2` в каталог `dir`:
|
||||
|
||||
```sh
|
||||
git clone git@gitlab.2:user/repo.git dir
|
||||
```
|
||||
|
||||
Просмотр состояния рабочего каталога и репозитория:
|
||||
|
||||
```sh
|
||||
git status
|
||||
```
|
||||
|
||||
Краткая форма вывода состояния:
|
||||
|
||||
```sh
|
||||
git status -s
|
||||
```
|
||||
|
||||
Добавление файла `README.md` под версионный контроль и подготовка
|
||||
к фиксации:
|
||||
|
||||
```sh
|
||||
git add README.md
|
||||
```
|
||||
|
||||
Удаление файла `README.md` из индекса репозитория:
|
||||
|
||||
```sh
|
||||
git rm --cached README.md
|
||||
```
|
||||
|
||||
Зафиксировать файлы, подготовленные к фиксации:
|
||||
|
||||
```sh
|
||||
git commit
|
||||
```
|
||||
|
||||
Зафиксировать все отслеживаемые файлы, которые были изменены:
|
||||
|
||||
```sh
|
||||
git commit -a
|
||||
```
|
||||
|
||||
Отправить все ветки репозитория на сервер с меткой `origin`:
|
||||
|
||||
```sh
|
||||
git push origin
|
||||
```
|
10
wiki/Prog/Git/Git распаковка объекта.adoc
Normal file
10
wiki/Prog/Git/Git распаковка объекта.adoc
Normal file
@@ -0,0 +1,10 @@
|
||||
= Git: распаковка объекта
|
||||
:category: Программирование
|
||||
:tags: программирование, git,
|
||||
|
||||
В случае повреждения репозитория можно восстановить отдельные объекты,
|
||||
которые сохраняются в формате zlib. Пример команды:
|
||||
|
||||
....
|
||||
perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' < 1234567890abcdef1234567890abcdef012345 > file
|
||||
....
|
@@ -1,14 +0,0 @@
|
||||
---
|
||||
title: "Git: распаковка объекта"
|
||||
category: Программирование
|
||||
tags: программирование, git,
|
||||
monofontoptions:
|
||||
- Scale=0.7
|
||||
...
|
||||
|
||||
В случае повреждения репозитория можно восстановить отдельные
|
||||
объекты, которые сохраняются в формате zlib. Пример команды:
|
||||
|
||||
```
|
||||
perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' < 1234567890abcdef1234567890abcdef012345 > file
|
||||
```
|
@@ -1,26 +1,26 @@
|
||||
---
|
||||
title: "Git: репозиторий на переносном устройстве"
|
||||
category: Программирование
|
||||
tags: программирование, git,
|
||||
...
|
||||
= Git: репозиторий на переносном устройстве
|
||||
:category: Программирование
|
||||
:tags: программирование, git,
|
||||
|
||||
Создание репозитория для нового проекта:
|
||||
|
||||
```sh
|
||||
[source,sh]
|
||||
----
|
||||
ln -s /media/user/usbdisk/git /home/user/work/usbdisk/git
|
||||
git --bare init /home/user/work/usbdisk/git/project.git
|
||||
cd /home/user/work/projects
|
||||
git clone /home/user/work/usbdisk/git/project.git
|
||||
cd project
|
||||
git remote set-url usb file:///home/user/work/usbdisk/git/project.git/
|
||||
```
|
||||
----
|
||||
|
||||
Добавление нового удалённого репозитория к существующему проекту:
|
||||
|
||||
```sh
|
||||
[source,sh]
|
||||
----
|
||||
ln -s /media/user/usbdisk/git /home/user/work/usbdisk/git
|
||||
git --bare init /home/user/work/usbdisk/git/project.git
|
||||
cd /home/user/work/projects/project
|
||||
git remote add usb file:///home/user/work/usbdisk/git/project.git
|
||||
git push --set-upstream usb master
|
||||
```
|
||||
----
|
29
wiki/Prog/Git/Git частичная копия репозитория.adoc
Normal file
29
wiki/Prog/Git/Git частичная копия репозитория.adoc
Normal file
@@ -0,0 +1,29 @@
|
||||
= Git: частичная копия репозитория
|
||||
:category: Программирование
|
||||
:tags: программирование, git,
|
||||
|
||||
Если проект очень большой, а следить нужно только за малой его частью,
|
||||
можно создать частичную копию репозитория. Допустим, по адресу
|
||||
`git://localhost/project.git` находится большой проект, в котором
|
||||
интересует только последнее состояние каталогов `src/driver` и
|
||||
`include/driver`. Сначала нужно создать пустой репозиторий и подготовить
|
||||
его для получения только необходимых файлов:
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
git init project
|
||||
cd project
|
||||
git remote add origin git://localhost/project.git
|
||||
git config core.sparsecheckout true
|
||||
echo "src/driver/*" >> .git/info/sparse-checkout
|
||||
echo "include/driver/*" >> .git/info/sparse-checkout
|
||||
----
|
||||
|
||||
После этого можно получать частичную копию проекта, а, добавив ключ
|
||||
`--depth=1`, указать, что синхронизироваться должно только текущее
|
||||
состояние файлов без учёта истории.
|
||||
|
||||
[source,sh]
|
||||
----
|
||||
git pull --depth=1 origin master
|
||||
----
|
@@ -1,31 +0,0 @@
|
||||
---
|
||||
title: "Git: частичная копия репозитория"
|
||||
category: Программирование
|
||||
tags: программирование, git,
|
||||
summary:
|
||||
...
|
||||
|
||||
Если проект очень большой, а следить нужно только за малой
|
||||
его частью, можно создать частичную копию репозитория.
|
||||
Допустим, по адресу `git://localhost/project.git` находится
|
||||
большой проект, в котором интересует только последнее
|
||||
состояние каталогов `src/driver` и `include/driver`.
|
||||
Сначала нужно создать пустой репозиторий и подготовить его
|
||||
для получения только необходимых файлов:
|
||||
|
||||
```sh
|
||||
git init project
|
||||
cd project
|
||||
git remote add origin git://localhost/project.git
|
||||
git config core.sparsecheckout true
|
||||
echo "src/driver/*" >> .git/info/sparse-checkout
|
||||
echo "include/driver/*" >> .git/info/sparse-checkout
|
||||
```
|
||||
|
||||
После этого можно получать частичную копию проекта,
|
||||
а, добавив ключ `--depth=1`, указать, что синхронизироваться
|
||||
должно только текущее состояние файлов без учёта истории.
|
||||
|
||||
```sh
|
||||
git pull --depth=1 origin master
|
||||
```
|
38
wiki/Prog/Git/Gitlab выполнение по расписанию.adoc
Normal file
38
wiki/Prog/Git/Gitlab выполнение по расписанию.adoc
Normal file
@@ -0,0 +1,38 @@
|
||||
= GitLab: выполнение по расписанию
|
||||
:category: Программирование
|
||||
:tags: программирование, gitlab, git,
|
||||
|
||||
После помещения изменений (push) на сервер следует выполнять только
|
||||
задачи, не требующие много ресурсов. Ресурсоёмкие задачи можно отложить
|
||||
на время минимальной нагрузки сервера. Для этого нужно:
|
||||
|
||||
* в секциях файла `.gitlab-ci.yml`, запускающих задачи с высокой
|
||||
нагрузкой, добавить
|
||||
|
||||
[source,yaml]
|
||||
----
|
||||
only:
|
||||
- schedules
|
||||
----
|
||||
|
||||
подробнее это описано
|
||||
https://docs.gitlab.com/ee/ci/yaml/#only-and-except-simplified[здесь]
|
||||
|
||||
* в веб-интерфейсе в меню *CI/CD* / *Расписания* добавить *Новое
|
||||
расписание* и назначить исполнение задачи на время, когда нагрузка на
|
||||
сервер минимальна.
|
||||
|
||||
Для пропуска запланированной задачи в исполняемый скрипт нужно добавить
|
||||
проверку условия запуска. Например, чтобы отменить запуск компиляции,
|
||||
если за последний день (86400 секунд) не было изменений, можно оформить
|
||||
`.gitlab-ci.yml` примерно так:
|
||||
|
||||
[source,yaml]
|
||||
----
|
||||
nightly-job:
|
||||
only:
|
||||
- schedules
|
||||
script:
|
||||
- "[ $(($(date +%s)-$(git log -1 --date=format:%s --format=%cd))) -gt 86400 ] && exit 0"
|
||||
- make
|
||||
----
|
@@ -1,36 +0,0 @@
|
||||
---
|
||||
title: "GitLab: выполнение по расписанию"
|
||||
category: Программирование
|
||||
tags: программирование, gitlab, git,
|
||||
...
|
||||
|
||||
После помещения изменений (push) на сервер следует выполнять только задачи,
|
||||
не требующие много ресурсов. Ресурсоёмкие задачи можно отложить на время
|
||||
минимальной нагрузки сервера. Для этого нужно:
|
||||
|
||||
* в секциях файла `.gitlab-ci.yml`, запускающих задачи с высокой нагрузкой,
|
||||
добавить
|
||||
|
||||
```yaml
|
||||
only:
|
||||
- schedules
|
||||
```
|
||||
|
||||
подробнее это описано [здесь](https://docs.gitlab.com/ee/ci/yaml/#only-and-except-simplified)
|
||||
|
||||
* в веб-интерфейсе в меню **CI/CD** / **Расписания** добавить **Новое расписание**
|
||||
и назначить исполнение задачи на время, когда нагрузка на сервер минимальна.
|
||||
|
||||
Для пропуска запланированной задачи в исполняемый скрипт нужно добавить
|
||||
проверку условия запуска. Например, чтобы отменить запуск компиляции,
|
||||
если за последний день (86400 секунд) не было изменений, можно оформить
|
||||
`.gitlab-ci.yml` примерно так:
|
||||
|
||||
```yaml
|
||||
nightly-job:
|
||||
only:
|
||||
- schedules
|
||||
script:
|
||||
- "[ $(($(date +%s)-$(git log -1 --date=format:%s --format=%cd))) -gt 86400 ] && exit 0"
|
||||
- make
|
||||
```
|
@@ -1,33 +1,31 @@
|
||||
---
|
||||
title: "Установка и настройка GitLab в LXC"
|
||||
category: Программирование
|
||||
tags: программирование, gitlab, git, lxc, контейнеры, ubuntu,
|
||||
summary:
|
||||
toc: yes
|
||||
...
|
||||
= Установка и настройка GitLab в LXC
|
||||
:category: Программирование
|
||||
:tags: программирование, gitlab, git, lxc, контейнеры, ubuntu,
|
||||
|
||||
[TOC]
|
||||
:toc:
|
||||
|
||||
Установка выполняется в операционной системе Ubuntu Bionic.
|
||||
|
||||
### LXC
|
||||
== LXC
|
||||
|
||||
Создание базового контейнера:
|
||||
|
||||
```sh
|
||||
[source,sh]
|
||||
----
|
||||
lxc-create -t download -n bionic-base -- --dist ubuntu --release bionic --arch amd64
|
||||
```
|
||||
----
|
||||
|
||||
Создание контейнеров для GitLab и GitLab Runner:
|
||||
|
||||
```sh
|
||||
[source,sh]
|
||||
----
|
||||
lxc-copy -n bionic-base -N gitlab-bionic -s
|
||||
lxc-copy -n bionic-base -N gitlab-runner-bionic -s
|
||||
```
|
||||
----
|
||||
|
||||
Файл `/var/lib/lxc/gitlab-bionic/config`:
|
||||
|
||||
```
|
||||
....
|
||||
# Distribution configuration
|
||||
lxc.include = /usr/share/lxc/config/common.conf
|
||||
|
||||
@@ -50,11 +48,11 @@ lxc.autodev = 1
|
||||
lxc.pty.max = 16384
|
||||
lxc.cgroup.devices.allow = c 10:200 rwm
|
||||
lxc.mount.entry = /dev/net dev/net none bind,create=dir
|
||||
```
|
||||
....
|
||||
|
||||
Файл `/var/lib/lxc/gitlab-runner-bionic/config`:
|
||||
|
||||
```
|
||||
....
|
||||
# Distribution configuration
|
||||
lxc.include = /usr/share/lxc/config/common.conf
|
||||
|
||||
@@ -82,65 +80,67 @@ lxc.autodev = 1
|
||||
lxc.pty.max = 16384
|
||||
lxc.cgroup.devices.allow = c 10:200 rwm
|
||||
lxc.mount.entry = /dev/net dev/net none bind,create=dir
|
||||
```
|
||||
....
|
||||
|
||||
### GitLab
|
||||
== GitLab
|
||||
|
||||
Установить GitLab:
|
||||
|
||||
```sh
|
||||
[source,sh]
|
||||
----
|
||||
sudo lxc-start -n gitlab-bionic
|
||||
sudo lxc-attach -n gitlab-bionic
|
||||
sudo apt install curl
|
||||
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
|
||||
sudo apt install gitlab-ce
|
||||
```
|
||||
----
|
||||
|
||||
Отредактировать файл `/etc/locale.gen` и сгенерировать локали для системы:
|
||||
Отредактировать файл `/etc/locale.gen` и сгенерировать локали для
|
||||
системы:
|
||||
|
||||
```sh
|
||||
[source,sh]
|
||||
----
|
||||
sudo locale-gen
|
||||
```
|
||||
----
|
||||
|
||||
Отредактировать файл `/etc/gitlab/gitlab.rb` и выполнить:
|
||||
|
||||
```sh
|
||||
[source,sh]
|
||||
----
|
||||
sudo gitlab-ctl reconfigure
|
||||
sudo gitlab-ctl restart
|
||||
```
|
||||
----
|
||||
|
||||
|
||||
### GitLab Runner и Docker
|
||||
== GitLab Runner и Docker
|
||||
|
||||
Установить GitLab Runner:
|
||||
|
||||
```sh
|
||||
[source,sh]
|
||||
----
|
||||
sudo lxc-start -n runner-bionic
|
||||
sudo lxc-attach -n runner-bionic
|
||||
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
|
||||
sudo apt install gitlab-runner docker.io
|
||||
sudo gitlab-runner register
|
||||
```
|
||||
----
|
||||
|
||||
Во время установки ввести токен приведённый на странице `admin/runners`,
|
||||
а в качестве исполнителя задач `docker`.
|
||||
|
||||
Для работы Docker внутри контейнера нужно удалить AppArmor:
|
||||
|
||||
```sh
|
||||
[source,sh]
|
||||
----
|
||||
sudo apt purge apparmor
|
||||
```
|
||||
----
|
||||
|
||||
Внутри контейнера для Docker желательно использовать драйвер `btrfs`
|
||||
cat /etc/docker/daemon.json
|
||||
Внутри контейнера для Docker желательно использовать драйвер `btrfs` cat
|
||||
/etc/docker/daemon.json
|
||||
|
||||
{
|
||||
"storage-driver": "btrfs"
|
||||
}
|
||||
\{ ``storage-driver'': ``btrfs'' }
|
||||
|
||||
== Ссылки
|
||||
|
||||
### Ссылки
|
||||
|
||||
* [GitLab Runner](https://docs.gitlab.com/runner/register/index.html)
|
||||
* [Runners](https://docs.gitlab.com/ee/ci/runners/)
|
||||
* [Gitlab-CI](https://habr.com/ru/company/southbridge/blog/306596/)
|
||||
* https://docs.gitlab.com/runner/register/index.html[GitLab Runner]
|
||||
* https://docs.gitlab.com/ee/ci/runners/[Runners]
|
||||
* https://habr.com/ru/company/southbridge/blog/306596/[Gitlab-CI]
|
Reference in New Issue
Block a user