Рубрики
git

google repo

Ссылка:

https://gerrit.googlesource.com/git-repo
https://source.android.com/docs/setup/reference/repo?hl=ru
https://source.android.com/docs/setup/reference/repo

Установка из пакетов:

Repo дополняет Git, упрощая работу с несколькими репозиториями. 

# Debian/Ubuntu.
$ sudo apt-get install repo

# Gentoo.
$ sudo emerge dev-vcs/repo
You can install it manually as well as it's a single script.

Установка:

$ mkdir -p ~/.bin
$ PATH="${HOME}/.bin:${PATH}"
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
$ chmod a+rx ~/.bin/repo

Использование:

Использование репо принимает следующую форму:
repo command options

Необязательные элементы показаны в скобках []. 
Например, многие команды принимают project-list в качестве аргумента. 
Вы можете указать project-list как список имен или список путей к локальным исходным каталогам проектов:

repo sync [project0 project1 ... projectn]
repo sync [/path/to/project0 ... /path/to/projectn]




repo init -u url [options] - Устанавливает Repo в текущий каталог. 
Эта команда создает каталог .repo/ с репозиториями Git для исходного кода Repo и стандартных файлов манифеста Android.
Параметры:
-u : укажите URL-адрес, по которому нужно получить репозиторий манифестов. 
     Общий манифест находится по адресу https://android.googlesource.com/platform/manifest 
-m : выбрать файл манифеста в репозитории. 
     Если имя манифеста не выбрано, по умолчанию используется default.xml
-b : указать ревизию, то есть конкретную manifest-branch




Синхронизировать:

repo sync [project-list]
Загружает новые изменения и обновляет рабочие файлы в вашей локальной среде, по сути выполняя git fetch во всех репозиториях Git. 
Если вы запустите repo sync без аргументов, она синхронизирует файлы для всех проектов.
Когда вы запускаете repo sync , происходит вот что:
Если проект никогда не синхронизировался, то repo sync эквивалентна git clone ; все ветки удаленного репозитория копируются в локальный каталог проекта.
Если проект уже был синхронизирован ранее, то repo sync эквивалентна:
git remote update
git rebase origin/branch
Где branch — это текущая извлеченная ветка в локальном каталоге проекта. 
Если локальная ветка не отслеживает ветку в удаленном репозитории, синхронизация проекта не происходит.
Ключевые параметры:
-c : получить с сервера только текущую ветку манифеста.
-d : переключить указанные проекты обратно на версию манифеста. 
     Эта опция полезна, если проект находится в тематической ветке, но версия манифеста необходима временно.
-f : продолжить синхронизацию других проектов, даже если проект не удалось синхронизировать.
threadcount : разделите синхронизацию между потоками для более быстрого завершения. 
              Убедитесь, что вы не перегружаете свою машину — оставьте часть процессора зарезервированной для других задач. 
              Чтобы увидеть количество доступных процессоров, сначала запустите nproc --all.
-q : работать тихо, подавляя сообщения о состоянии.
-s : синхронизировать с заведомо исправной сборкой, указанной в элементе manifest-server в текущем манифесте.
Чтобы получить дополнительные параметры, запустите repo help sync.

загрузить


repo upload [project-list]
Загружает изменения на сервер проверки. 
Для указанных проектов Repo сравнивает локальные ветки с удаленными ветвями, обновленными во время последней синхронизации Repo. 
Репо предложит вам выбрать одну или несколько веток, которые не были загружены на проверку.

Все коммиты в выбранных ветках затем передаются в Gerrit через соединение HTTPS. 
Вам необходимо настроить пароль HTTPS, чтобы включить авторизацию загрузки. 
Чтобы создать новую пару имени пользователя и пароля для использования через HTTPS, посетите генератор паролей .

Когда Gerrit получает данные объекта через свой сервер, он превращает каждый коммит в изменение, чтобы рецензенты могли прокомментировать конкретный коммит. 
Чтобы объединить несколько коммитов контрольных точек в один, используйте git rebase -i перед запуском загрузки.

Если вы запускаете repo upload без аргументов, он ищет во всех проектах изменения для загрузки.

Чтобы редактировать изменения после их загрузки, используйте такой инструмент, как git rebase -i или git commit --amend чтобы обновить локальные коммиты. 

После завершения редактирования:
Убедитесь, что обновленная ветка является текущей извлеченной веткой.
Используйте repo upload --replace PROJECT , чтобы открыть редактор сопоставления изменений.
Для каждого коммита в серии введите идентификатор изменения Gerrit в скобках.

После завершения загрузки изменения имеют дополнительный набор патчей.
Если вы хотите загрузить только извлеченную в данный момент ветку Git, используйте флаг --current-branch (или --cbr для краткости).

разница

repo diff [project-list]
Показывает существенные изменения между фиксацией и рабочим деревом с помощью "git diff"

скачать

repo download target change

Загружает указанное изменение из системы проверки и делает его доступным в локальном рабочем каталоге вашего проекта.
Например, чтобы загрузить изменение 23823 в каталог вашей platform/build :
repo download platform/build 23823

Запуск repo sync удаляет все коммиты, полученные при "repo download". 
Или вы можете проверить удаленную ветку, используя git checkout m/main 

Рубрики
git

etckeeper push в gitlib

Установка:

apt install git etckeeper

Поправить /etc/cron.daily/etckeeper:

!!! Не обязательно, добавить etckeeper commit "daily autocommit" >/dev/null 2>/dev/null
!!! Убирает лишнюю разговорчивость etckeeper

#!/bin/sh
set -e
if [ -x /usr/bin/etckeeper ] && [ -e /etc/etckeeper/etckeeper.conf ]; then
        . /etc/etckeeper/etckeeper.conf
        if [ "$AVOID_DAILY_AUTOCOMMITS" != "1" ]; then
                # avoid autocommit if an install run is in progress
                lockfile=/var/cache/etckeeper/packagelist.pre-install
                if [ -e "$lockfile" ] && [ -n "$(find "$lockfile" -mtime +1)" ]; then
                        rm -f "$lockfile" # stale
                fi
                if [ ! -e "$lockfile" ]; then
                        AVOID_SPECIAL_FILE_WARNING=1
                        export AVOID_SPECIAL_FILE_WARNING  
                        if etckeeper unclean; then
                        etckeeper commit "daily autocommit" >/dev/null 2>/dev/null
                        fi
                fi
        fi
fi

Создать ключ и прописать в конфиг ssh:

0. Генерируем ключ
ssh-keygen -b 2048 -t rsa -f /etc/etckeeper/id_rsa -q -N ""

1. Правим файл /root/.ssh/config
vim /root/.ssh/config
------------------------
Host etckeeper.DOMAN_NAME
      User USER_NAME_GIT
      IdentityFile /etc/etckeeper/id_rsa
------------------------

Добавить репозиторий (предварительно создав его на etckeeper.YOU_DOMAN_NAME):

cd /etc
etckeeper init
git remote add origin ssh://USER_NAME_GIT@etckeeper.YOU_DOMAN_NAME:29418/YOU_REPO_NAME.git

Поправить конфиг /etc/etckeeper/etckeeper.conf

vim  /etc/etckeeper/etckeeper.conf
----------------------------------
VCS="git"
PUSH_REMOTE="origin"
----------------------------------

Добавить ключ в etckeeper:

cd /etc/etckeeper/
cat id_rsa.pub | ssh -l USER_NAME_GIT -p 29418 etckeeper.YOU_DOMAN_NAME keys add

Протестировать:

cd /etc
git push -u origin master

Рубрики
git

gitlab \ свой сервер git \ web-интерфейс \ установка и настройка

ссылки:

https://habr.com/ru/company/ruvds/blog/359216/ - статья на хабре о git, gitlab, github, etc
https://docs.gitlab.com/omnibus/manual_install.html - инструкция ручная установка
https://about.gitlab.com/install/#debian  - инструкция ручная установка

Что такое gitlab


GitHub — это крупнейший в мире сервис для хостинга кода, его собственный код закрыт. 
Это — не opensource проект, то есть, нельзя взять этот код и создать на его основе собственный GitHub. 
 
Но, как это обычно бывает в мире opensource, проектам с закрытым кодом можно найти замену.
В данном случае заменой GitHub может послужить весьма привлекательный opensource проект GitLab.
Он позволяет всем желающим разворачивать на собственных серверах нечто подобное GitHub. 
При этом GitLab можно использовать и для поддержки работы крупной компании или большой команды, 
и для организации собственного репозитория для небольшого проекта, 
который пока не готов к тому, чтобы представить его широкой общественности.

GitLab задействует бизнес-модель, характерную для opensource проектов.
А именно, имеется свободно распространяемая версия ПО, которую все желающие могут разворачивать на своих серверах, и хостинг кода, похожий на GitHub.

Свободно распространяемая версия GitLab имеет две редакции — бесплатную Community Edition (Core) и платную Enterprise Edition (существуют её варианты Starter, Premium и Ultimate). 
Последняя основана на Community Edition, которая отлично масштабируется, и, кроме того, включает в себя некоторые дополнительные возможности, ориентированные на организации. 
Среди возможностей GitLab можно отметить управление Git-репозиториями, средства обзора кода, наличие системы отслеживания ошибок, ленты активности, поддержку вики-страниц. 
Здесь имеется и GitLab CI — система непрерывной интеграции.

Установка

0. Сначала нужно установить postfix
apt-get install postfix - установим postfix

1.  Настроить postfix
dpkg-reconfigure postfix - настроим почту 
После запуска этой команды нужно указать параметр Internet Site и задать почтовый идентификатор для домена, который будет использоваться GitLab. 
Далее, надо будет указать имя пользователя для Postfix и почтовый адрес. 
Значения остальных параметров можно не менять. 
После установки и настройки Postfix можно заняться GitLab

2. Идем на сайт https://about.gitlab.com/install/ 
Выбираем ваш дистрибутив linux.
Читаем инструкцию.

3. Далее подготовка к установке для debian
apt-get update - обновляем список пакетов
apt-get install -y curl openssh-server ca-certificates perl sudo - устанавливаем пакеты curl, openssh-server, ca-certificates, perl
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | bash  - собственно устанавливаем необходимые пакеты используя скрипт установки от gitlab

4. Установка 
apt-get install gitlab-ee  - устанавливаем
Если сейчас запустить команду "gitlab-ctl reconfigure" то gitlab соберётся и к нему можно будет подключится по http 


5. Редактируем файл "/etc/gitlab/gitlab.rb" для работы https (сертификаты от Let's Encrypt ну или само подписанные)
nano /etc/gitlab/gitlab.rb
--------------------------
external_url 'http://gitlab.exemple.com' - находим эту строку
external_url 'https://gitlab.b14esh.com' - приводим к желаемому виду, указываем правильный url. в моем случае это 'https://gitlab.b14esh.com'
--------------------------

6. Запускаем "gitlab-ctl reconfigure" 
!!! при не удачном срабатывании (не доступен Let's Encrypt) запустите еще раз.
gitlab-ctl reconfigure


7. Открываем браузер, входим в gitlab (в моем случае это https://gitlab.b14esh.com).
При первом посещении вы будете перенаправлены на экран сброса пароля.
Введите пароль для начальной учетной записи администратора, и вы будете перенаправлены обратно на экран входа в систему. 
Для входа используйте имя пользователя учетной записи по умолчанию (root).


Рубрики
git

git свой сервер \ простой пример

ссылки:

https://git-scm.com/book/ru/v2/Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80
https://git-scm.com/book/ru/v2/Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%B0%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80
https://habr.com/ru/company/ruvds/blog/359216/

Сервер на примере debian и чистый репозиторий

0. Устанавливаем
apt-get install git-core git

1. Создаем пользователя git
adduser git

2. Подключаемся под пользователем git 
ssh git@localhost

3. Создаем каталог для репозиториев
!!! Внимание имякаталога.git в конце .git в имени каталога для репозитория обязательна !!!
mkdir my_projects.git

4. Входим в каталог my_project.git и инициируем репозиторий
cd my_project.git
git init --bare
  
5. Если увидели надпись "Инициализирован пустой репозиторий Git в /home/git/my_projects.git/"  на этом с серверной частью все.
!!! запомнили путь до репозитория правая часть в примере "/home/git/my_projects.git/" пригодится

Клиентская часть для windows

0. Скачиваем git и устанавливаем
Ссылка:  https://gitforwindows.org/ 
1. У нас должна появится программа gitbash запускам ее
gitbash

2. Первым дело создаем каталог для локального репозитория
mkdir my_projects

3. Входим в него и производим первичную настройку
cd my_projects
git init
git config --global user.name "Vasya Pupkin"
git config --global user.email "ваш@почтовый.ящик"

4. Создаем какой ни будь файл для проверки в каталоге my_projects
копированием \ Set-Content ".\test.txt" -Value "вот такой я шляпой занимаюсь" \ echo "xxxx" > file.txt \ как угодно! 

5. Выполняем 
git add .
git commit -m 

6. Генерируем пару ключей закрытый\открытый. (в gitbash)
ssh-keygen.exe

7. Копируем его на сервер (gitbash) (потребуется ввести пароль пользователя git)
!!! Обратите внимание что нужно указать правильное имя и правильный  ip или DNS-имя
ssh-copy-id git@192.168.1.15

8. Настраиваем само подключение к серверу git
git remote add origin git@192.168.1.15:/srv/git/my_project.git

9. Ну собственно проверяем залив наши файлы на репозиторий 
git push origin master

Клиентская часть для linux \ debian

0. Устанавливаем git
apt install git

1. Первым дело создаем каталог для локального репозитория
mkdir my_projects

2. Входим в него и производим первичную настройку
cd my_projects
git init
git config --global user.name "Vasya Pupkin"
git config --global user.email "ваш@почтовый.ящик"

3. Создаем какой ни будь файл для проверки в каталоге my_projects
echo "xxxx" > file.txt  

4. Выполняем 
git add .
git commit -m 

5. Генерируем пару ключей закрытый\открытый. (в gitbash)
ssh-keygen.exe

6. Копируем его на сервер (gitbash) (потребуется ввести пароль пользователя git)
!!! Обратите внимание что нужно указать правильное имя и правильный  ip или DNS-имя
ssh-copy-id git@192.168.1.15

7. Настраиваем само подключение к серверу git
git remote add origin git@192.168.1.15:/srv/git/my_project.git

8. Ну собственно проверяем залив наши файлы на репозиторий 
git push origin master

Разовое клонирование репозитория(в примере тот же пк другой пользователь)

git clone git@localhost:/home/git/my_projects.git/

Репозиторий будет доступен для чтения, что бы получить возможность "git push origin master": 
git config --global user.name "Vasya Pupkin" 
git config --global user.email "ваш@почтовый.ящик"
git remote add origin git@192.168.1.15:/srv/git/my_project.git

Пример работы удаленных пользователей git:


0. Что бы не плодить пользователей в системе, 
   на сервере можно добавить публичные ключи других пользователей, 
   пользователю git в файл .ssh/authorized_keys
   
1. Основные команды:
Клонируем репозиторий:
git clone git@server:/srv/git/automation.git
Добавляем описание нашего пользователя:
git config --global user.name "Vasya Pupkin"
git config --global user.email "ваш@почтовый.ящик"

!!! Внимание ветка мастера
Загрузить на сервер git
git push origin master
Скачать с сервера git 
git pull origin master

Повседневные команды:
git add.
git commit -m "YOU COMMIT"
git log
checkout
Рубрики
git

git lfs / большие файлы

загрузка в git

https://git-lfs.github.com/ - офф документация
В git есть ограничение на размер фала не более 100мб.
Что бы это обойти есть специальный репозиторий в git.
Нужно установить Git Large File Storege или Git LFS
0. Установить  
git lfs install
1. Определить какие фалы будут отслеживаться
git lfs track "* .psd"
2. Залить файлы в github
git add file.psd
git commit -m "new file"
git push origin master

Загрузка из git lfs

!!! sudo apt install git-lfs
!!! Внимание при клонировании repasitory не загружаются файлы git lfs
git clone repository_name - тесть так качаются файлы до 100 мб
git lfs  pull  - вот так можно до грузить большие файлы из git lfs

Рубрики
git Конспект

Конспект: GitHub Action

Введение:

https://www.youtube.com/watch?v=Yg5rpke79X4&list=PLg5SS_4L6LYstwxTEOU05E0URTHnbtA0l&index=14 - видосик

GitHub Action - позволяет запускать Linux и Windows команды, а также автоматизировать Test, Build, Deploy нашего кода в Repasitory GitHub
без использования серверов для этой автоматизации например Jenkins.

0. Включение автоматизации GitHub Action

Включение автоматизации происходит добавлением файлов YAML
в специальную директорию .github/workflows в вашем Repository 

.github/workflows/myfile_pipe_line.yml

*.yml - имя файла YAML может быть любым

Синтаксис очень похож на Ansible и Dockerfile

1. default файл YAML

# This is a basic workflow to help you get started with Actions

name: CI

# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the master branch
on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
    # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
    - uses: actions/checkout@v2

    # Runs a single command using the runners shell
    - name: Run a one-line script
      run: echo Hello, world!

    # Runs a set of commands using the runners shell
    - name: Run a multi-line script
      run: |
        echo Add other actions to build,
        echo test, and deploy your project.

2. Создание и редактирование Action

!!! идем в репозитории -> Action -> Skip this and set up a workflow yourself 
!!! попадаем в редактор Action
!!! Называем файл как хотим
!!! клавиши ctrl + space - авто подстановка значений

# Коментарии...
name: My-Project1  # важное имя, без пробелов
env: # глобальные переменные
  APPLICATION_NAME     : "MyFlask" # глобальные переменные
  DEPLOY_PACKAGE_NAME  : "flask-deploy-ver-${{ github.sha }}" # глобальные переменные
on: # когда запустить
  push: # запустить при push на ветку master 
    branches: 
          - master
  
jobs:
  my_testing:
    runs-on: ubuntu-latest # какие образы используются

    steps:
    - name: Print hello message  # Название задачи
      run : echo "Hello world from testing" # Задача

    - name: Execute few commands
      run: |
        echo "Hello Message1" 
        echo "Hello Message2"
        echo "Aplication name: ${{ env.APPLICATION_NAME }}"          

    - name: Git clone myproject
      uses: actions/checkout@v1 # получаем наш репозиторий git для виртуальной машины

  my_deploy:
    runs-on: ubuntu-latest
    needs: [my_testing]  # выполнять после выполнения my_testing

    steps: 
    - name: Print hello message
      run : echo "Hello world from deploy"

3. Пример файла YAML

name: My-Project1
env:
  APPLICATION_NAME     : "MyFlask"
  DEPLOY_PACKAGE_NAME  : "flask-deploy-ver-${{ github.sha }}"
   
on: 
  push: 
    branches: 
          - master
  
jobs:
  my_testing:
    runs-on: ubuntu-latest

    steps:
    - name: Print hellow message in testing
      run : echo "Hello world from testing"
    
    - name: Execute few commands
      run: |
        echo "Hello Message1" 
        echo "Hello Message2"
        echo "Aplication name: ${{ env.APPLICATION_NAME }}"
     
    - name: List current folder
      run : ls -la    
    
    - name: Git clone myproject
      uses: actions/checkout@v1
 
    - name: List current folder
      run : ls -la    
    
       
  my_deploy:
    runs-on: ubuntu-latest
    needs: [my_testing] 
    env:
      VAR1: "This is Job Level var1"
      VAR2: "This is Job Level var2"
    steps: 
    - name: Print hello message deploy
      run : echo "Hello world from deploy"
    - name: Print vars
      run : |
        echo "Var1 = ${{ env.VAR1 }}"
        echo "Var2 = ${{ env.VAR2 }}"
        echo "Var3 = $LOCAL_VAE"
      env:
        LOCAL_VAE: "This is super local Enviromment variable"  
    - name: Deploymend package
      run : echo "Deploy package name is ${{ env.DEPLOY_PACKAGE_NAME }}"
     
    - name: Lets test some packages iof the are here 1
      run : aws --version   
    
    - name: Lets test some packages iof the are here 2
      run : zip --version 

4. Пример файла yml для AWS

#---------------------------------------------------------------------
# GitHub Action Workflow to Deploy Flask App to AWS ElasticBeanstalk
#
# Version      Date        Info
# 1.0          2019        Initial Version
#
# Made by Denis Astahov ADV-IT Copyleft (c) 2019
#---------------------------------------------------------------------
name: CI-CD-Pipeline-to-AWS-ElasticBeastalk
env:
  EB_PACKAGE_S3_BUCKET_NAME : "adv-it-flask-application-packages"
  EB_APPLICATION_NAME       : "MyFlask"
  EB_ENVIRONMENT_NAME       : "MyFlask-env"
  DEPLOY_PACKAGE_NAME       : "flask_app_${{ github.sha }}.zip"
  AWS_REGION_NAME           : "us-west-2"

on: 
  push:
    branches: 
      - master

jobs:
  my_ci_part:
    runs-on: ubuntu-latest

    steps:
    - name: Git clone our repo
      uses: actions/checkout@v1
       
    - name: Create ZIP deployment package
      run : zip -r ${{ env.DEPLOY_PACKAGE_NAME }} ./ -x *.git*
      
    - name: Configure my AWS Credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id    :  ${{ secrets.MY_AWS_ACCESS_KEY }}
        aws-secret-access-key:  ${{ secrets.MY_AWS_SECRET_KEY }}
        aws-region           :  ${{ env.AWS_REGION_NAME }}
        
    - name: Copy Deployment package to S3 bucket
      run : aws s3 cp ${{ env.DEPLOY_PACKAGE_NAME }}  s3://${{ env.EB_PACKAGE_S3_BUCKET_NAME }}/
    
    - name: Print Happy Message for CI finish
      run : echo "CI Pipeline part Finished successfully!"


  my_cd_part:
    runs-on: ubuntu-latest
    needs: [my_ci_part]

    steps:
    - name: Configure my AWS Credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id    :  ${{ secrets.MY_AWS_ACCESS_KEY }}
        aws-secret-access-key:  ${{ secrets.MY_AWS_SECRET_KEY }}
        aws-region           :  ${{ env.AWS_REGION_NAME }}
    
    - name: Create new ElasticBeanstalk Application Version
      run : |
        aws elasticbeanstalk create-application-version \
        --application-name ${{ env.EB_APPLICATION_NAME }} \
        --source-bundle S3Bucket="${{ env.EB_PACKAGE_S3_BUCKET_NAME }}",S3Key="${{ env.DEPLOY_PACKAGE_NAME }}" \
        --version-label "Ver-${{ github.sha }}" \
        --description "CoimmitSHA-${{ github.sha }}"
       
    - name: Deploy new ElasticBeanstalk Application Version
      run : aws elasticbeanstalk update-environment --environment-name ${{ env.EB_ENVIRONMENT_NAME }} --version-label "Ver-${{ github.sha }}"
      
    - name: Print Happy Message for CD finish
      run : echo "CD Pipeline part Finished successfully!"





Рубрики
git Конспект

Конспект: Git

Ссылки

https://github.com/
https://gitlab.com/
https://aws.amazon.com/ru/codecommit/
https://bitbucket.org/

https://github.com/progit/progit2-ru - книга
https://githowto.com/ - онлайн учебник
https://githowto.com/ru/setup

https://git-scm.com/book/ru/v2 - книга
https://git-scm.com/book/en/v2/Getting-Started-Installing-Git - установка 
https://git-scm.com/downloads - загрузка дистрибутива windows и linux

https://www.youtube.com/watch?v=DK2PsTcSFFM&list=PLg5SS_4L6LYstwxTEOU05E0URTHnbtA0l - видео

0. Установка на debian \ ubuntu

sudo apt update && sudo apt upgrade - обновить список пакетов и обновить установленные пакеты
sudo apt install git - установка
git --version - посмотреть версию

0.1 Установка на redhat \ centos

sudo yum update - обновить установленные пакеты
sudo yum install git - установка
git --version - посмотреть версию

0.2 Установка на windows

https://git-scm.com/download/win - скачиваем и устанавливаем .... тупа next, next, next ...

1. Конфигурация .gitconfig

git config --global user.name "Evgeny Yakovlev" - задаем имя пользователя
git config --global user.email "git@b14esh.com" - задаем электронную почту (правильную почту указывать не обязательно)
git config -l - посмотреть что там настроили
cat ~/.gitconfig - посмотреть что там настроили 
!!! В windows так же файл  .gitconfig  находится в профиле пользователя

1.1 Не обязательно \ Параметры установки окончаний строк \ Установка отображения unicode

Параметры установки окончаний строк Unix/Mac:
git config --global core.autocrlf input
git config --global core.safecrlf warn

Параметры установки окончаний строк  Windows:
git config --global core.autocrlf true
git config --global core.safecrlf warn

Установка отображения unicode
По умолчанию, git будет печатать не-ASCII символов в именах файлов в виде восьмеричных последовательностей \nnn. 
Что бы избежать нечитаемых строк, установите соответствующий флаги:
git config --global core.quotepath off

2. Git работа с Local Repository / локальным репозиторием

mkdir myproject - создадим директорию
git init /home/user_name/myproject - создать локальный репозиторий /home/user_name/myproject
git init . - создать локальный репозиторий в текущем каталоге

.git - каталог, который будет создан при выполнении команды (git init .), некая база данных git

git status - покажет состояние репозитория (очень частая команда)

git add . - подготовили файлы к созданию снимка
git add * - подготовили файлы к созданию снимка
git add file_name - подготовили файл созданию снимка

git commit -m "My first commit " - создать снимок из подготовленных файлов 

git status - покажет состояние репозитория (очень частая команда)

3. Логи \ история изменений

git status - покажет состояние репозитория (очень частая команда)
git log - посмотреть историю изменений
git log -1 - посмотреть последний commit
git log -1 p - посмотреть изменение в последнем commit
git log -2 p - посмотреть изменение в последнем и предпоследнем commit

git log ID -p - посмотреть изменения в commit с ID
git log 62d232e98a5aa10aa13aee7e1f0cc1978c5d94e1 -p - посмотреть изменения в commit с 62d232e98a5aa10aa13aee7e1f0cc1978c5d94e1


3.1 Восстановление файлов

echo GADOSTI >> filename.txt - нагадили в файл 
cat - filename.txt - посмотреть файл
git status - посмотрели состояние git
git checkout -- filename.txt - отменить изменения в файле filename.txt (последний commit)

git diff --staged - показывает разницу между commit (+/- был, будет)

3.2 Игнорирование файлов \ .gitignore

echo "Super Log file" > sfile.log - создали файл sfile.log с содержимым "Super Log file"
mkdir log - создать папку log

nano .gitignore - создаем файл .gitignore со следующим содержимым
---------------
*.log
log/
filename.txt
---------------











4. Загрузка проекта на GitHub HTTPS

mkdir myproject - создали каталог myproject
cd  myproject - перешли в каталог myproject
git clone https://github.com/b14esh/myproject.git - загрузка проекта с github

cd myproject - перешли в каталог myproject
ls - посмотрели содержимое 
echo "Hello world" > first_file.txt - создали пустой файл

git add . - подготовили файлы к созданию снимка (добавили статус stagid)
git commit -m "My First commit" - создали снимок из подготовленных файлов (локальный репозиторий)
git push origin - отправили изменения на удаленный репозиторий


5. Загрузка проекта на GitHub SSH linux

cd - перешли в домашний каталог
ls ~/.ssh - посмотрели содержимое каталога .ssh, убедились что никаких ключей нет
ssh-keygen - с генерировали пару ключей приватный и публичный ( id_rsa и id_rsa.pub )
cat ~/.ssh/id_rsa.pub - что бы было удобнее скопировать выводим содержимое файла id_rsa.pub (публичный ключ) на экран терминала

Идем на https://github.com  справа user -> settings -> "ssh and GPG keys" -> "New SSH key"      ( https://github.com/settings/keys)

git remote -v - посмотреть как настроено подключение к репазиторию git
-------------
origin  https://github.com/b14esh/myproject.git (fetch)  - видим что используется HTTPS
origin  https://github.com/b14esh/myproject.git (push)
-------------

git remote set-url  origin git@github.com:b14esh/myproject.git - сменил настройки с HTTPS на SSH

git remote -v
-------------
origin  git@github.com:b14esh/myproject.git (fetch) - вот так выглядит SSH
origin  git@github.com:b14esh/myproject.git (push)
-------------

echo gg > x7.txt - создал файл x7.txt для теста
git add .  - подготовили файлы к созданию снимка
git commit -m "add file x7.txt" - создал снимок из подготовленных файлов (локальный репозиторий)
git push origin - отправили изменения на удаленный репозиторий



6. Загрузка проекта на GitHub SSH Windows

0. При установке git на windows установился gitbash, запускаем gitbash
1. ssh-keygen запускаем генерацию ключей ssh, при генерации ssh ключей напишет куда сохранит ssh ключи ( /c/Users/USER_NAME/.ssh/ примерно так )
2. cat .ssh/id_rsa.pub - показать содержимое файла id_rsa.pub (публичный ключ)
3. Идем на https://github.com  справа user -> settings -> "ssh and GPG keys" -> "New SSH key"      ( https://github.com/settings/keys)
4. Добавляем публичный ключ, название любое, но лучше дать адекватное название.
5. git clone git@github.com:b14esh/myproject.git  - загрузка проекта myproject с github

7. Создание и работа с ветвями (Branch) git

Обычно ветку master не изменяют.
Создают копию master, например ветку fix_error, выполняют исправления в новой ветке fix_error.
Когда в ветке fix_error все работает ее мигрируют в master.

git init myapp - создали новый локальный репазиторий myapp
cd myapp - перешли каталог myapp
git status - посмотрели состояние git

git branch - посмотреть ветки (в пустом репозитории команда ничего не покажет)

echo "ver1" > index.html - создали файл index.html с содержимым ver1
git add .  - подготовили файлы к созданию снимка
git commit -m "version1.0"  - создал снимок из подготовленных файлов (локальный репозиторий)
git branch - посмотреть ветки

echo "ver2" > index.html - изменили файл index.html с содержимым ver2
git add .  - подготовили файлы к созданию снимка
git commit -m "version2.0"  - создал снимок из подготовленных файлов (локальный репозиторий)


echo "ver3" > index.html - изменили файл index.html с содержимым ver3
git add .  - подготовили файлы к созданию снимка
git commit -m "version3.0"  - создал снимок из подготовленных файлов (локальный репозиторий)

git branch fix_error - создать ветку  fix_error
git checkout fix_error - выполнить переход на ветку fix_error
git branch - посмотреть ветки, убедится что переход на ветку fix_error был выполнен
git status - посмотрели состояние git, убедится что переход на ветку fix_error был выполнен

git checkout master - переключится на ветку мастер
git branch -d fix_error - удалить ветку fix_error

git checkout -b fix_error - создать ветку fix_error, переход будет выполнен сразу в ветку fix_error

echo "ver4" > index.html - изменили файл index.html с содержимым ver4
git add .  - подготовили файлы к созданию снимка
git commit -m "version4.0"  - создал снимок из подготовленных файлов (локальный репозиторий)
git log  - посмотреть историю изменений

7.1 Git миграция ветки fix_error в master

git branch - посмотрели какие у нас ветки
git checkout master - перешли в ветку мастер
git status - посмотрели состояние git, убедится что переход на ветку master был выполнен
git merge fix_error - выполнили слияние веток master с fix_error 
git branch -d fix_error - удаляем ветку fix_eror

7.2 Git удаление не нужной ветки test

git checkout -b test - создали ветку test и перешли в нее
echo "test 1111" > index.html - создали файл index.html с содержимым "test 1111"
git add .  - подготовили файлы к созданию снимка
git commit -m "test"  - создал снимок из подготовленных файлов (локальный репозиторий)
git checkout master - перешли в ветку мастер
git branch -d test - решили прибить ветку не нужна.... (windows удалила, а вот на linux ошибка error: The branch 'test' is not fully merged, просит -D)
git branch -D test - удалили ветку

7.2 Git создали ветку add_link, изменили, сделали слияние и удалили ветку add_link

git checkout -b add_link - создали ветку add_link и перешли в нее

echo "ver4.1" > index.html - изменили файл
git add . - подготовили файлы к созданию снимка
git commit -m "version 4.1" - создал снимок из подготовленных файлов (локальный репозиторий)
git status - посмотрели состояние git
git log - посмотреть историю изменений

echo "ver5" > index.html
git add .  - подготовили файлы к созданию снимка
git commit -m "version 5.0" - создал снимок из подготовленных файлов (локальный репозиторий)
git log - посмотреть историю изменений

git checkout master
git merge add_link
git status - посмотрели состояние git
git log - посмотреть историю изменений

git branch -d add_link - удалили ветку

8. Git возврат на предыдущие версии

git log - посмотреть историю изменений
git checkout ID_commit - перейти на ID_commit
git checkout 949589d98963f657928b4f1e4e2bf2e60a6a0065 - перейти на ID_commit 949589d98963f657928b4f1e4e2bf2e60a6a0065
git log - посмотреть историю изменений
git checkout master - перешли обратно в ветку мастер

8.1 Git изменить commit не создавая новый commit

git status - посмотрели состояние git
git log - посмотреть историю изменений

echo "version 5.0" > index.html - изменили файл index.html
git commit --amend - изменили последний commit

git log - посмотреть историю изменений

9. Git полный возврат на commit

!!! внимание, будет удаленно все
git status - посмотрели состояние git
git log - посмотреть историю изменений

!!! git reset --hard HEAD~ - полный возврат  на один commit (верхний comit будет удален)
!!! git reset --hard HEAD~2 - полный возврат на два commit ( два верхних comit будут удалены)

10. Git как удалить лог commit, файлы оставить последней версии

Дано у нас 4 commita
git status - посмотрели состояние git
git log - посмотреть историю изменений

git reset --soft HEAD~3 - удалит три верхних commit (файлы останутся последней версии)
git log - посмотреть историю изменений, увидим что остался последний commit

git commit --amend - если нужно можно изменить последний commit

11. Git полный рабочий цикл действий git + github

0. git clone git@github.com:b14esh/myproject.git - клонируем репозиторий
1. cd myproject/ - перешли в каталог myproject
2. git branch  - показать ветви
3. git checkout -b evgeny_task001 - создаем новую ветвь evgeny_task001 для работы
4. nano x7.txt - начинаем работать над файлом
5. git status - посмотрели состояние git
6. git add . - подготовили файлы к созданию снимка
7. git commit -m "test checkout branch"
8. git status - посмотрели состояние git
9. git log - посмотреть историю изменений
10. git push origin - пытаемся залить на сервер github исправления в файле, получаем ошибку что нет такой ветки evgeny_task001, и команду для создания ветви
11. git push --set-upstream origin evgeny_task001 - выполняем команду для загрузки на github и создания ветви evgeny_task001
12. Идем на github, нужно бы наши исправления добавить в мастер, запрашиваем выполнить merge жмем на кнопку "Compare & Pull Request". 
13. Собственно там будет выполнен "Merge pull request".
14.  git checkout master - переходим в мастер ветку
15.  git push origin --delete evgeny_task001 - работу по таску мы сделали, можно удалять нашу ветку evgeny_task001

12. git pull обновить репозиторий у себя с github

git pull - обновить репозиторий проекта у себя 

git autoupdate

#!/bin/bash
cd /home/ey/Documents
git add .
git commit -a -m "autoupdate `date +%F-%T`"
#git push

x

#---------------------------------------------------------------------
# Format for the commit title (the very first line) is the following:
#
# : (If applied, this commit will...)  (max 72 chars)
#
# Where `` is one of the following:
#   - build         = Changes to the build system
#   - ci            = CI related changes (GH actions, hooks, ...)
#   - docs          = Changes to the documentation/manuals
#   - feat          = The commit introduces a new feature
#   - fix           = The commit fixes a bug/regression/typo
#   - impr          = The commit bring some improvements
#   - misc          = Other actions
#   - package       = Changes to the package produced
#   - refactor      = The commit performs a refactoring
#   - release       = The commit prepares a repo for release
#   - style         = The commit fixes formatting
#   - testing       = Changes to the tests or testing process
#   - wip           = Work In Progress
#
# About conventional commits: https://www.conventionalcommits.org
#---------------------------------------------------------------------
# NOTE: Leave the next line empty to separate title from the body

# Explain why this change is being made below... (max 120 chars per line)


# Optionally provide links or keys to any relevant tickets, articles or other resources.
# See also: https://confluence.atlassian.com/fisheye/using-smart-commits-960155400.html

#---[Git inserted text goes blow]-------------------------------------