.. title: Разные полезности при работе с git
.. slug: git-tips
.. date: 2021-01-11 18:32:00 UTC+03:00
.. tags: git
.. category: git
.. link: 
.. description: Разные мелочи для работы с git 
.. type: text

Разные полезности при работе с git
==================================

Шаблон файла для настройки `.gitconfig`
---------------------------------------

Работает и под windows.

Файл находится в "домашнем" каталоге пользователя. 
Под windows он (каталог) определяется переменной среды ``HOME`` или (если переменная не задана), 
то в зависимости от версии ОС ``C:\Users\username\`` или ``C:\Documents and settings\username``.

Под linux обычно это ``/home/username``.

В домашнем каталоге следует создать подкаталог ``certs`` и 
положить туда файл с сертификатами 
`ca-bundle.crt <certs/ca-bundle.crt>`_.

Файл настроек:

.. code-block:: ini
   :number-lines:

   [core]
       editor = notepad.exe
       autocrlf = true
       whitespace = trailing-space,space-before-tab,indent-with-non-tab,cr-at-eol
       quotePath = false
       compression = 9
       commitGraph = true
   [http]
       sslCAInfo = ~/certs/ca-bundle.crt
       sslCAPath = ~/certs
   [alias]
       co = checkout
       ci = commit
       st = status
       br = branch
       hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short
       sub = submodule update --init --recursive
       rd = branch -rd
       rr = branch -rd
       chmod = update-index --chmod=+x
   [push]
       default = matching
   [fetch]
       recurseSubmodules = true
       prune = true
   [submodule]
       recurse = true
   [sendpack]
       sideband = false
   [user]
       name = unknown
       email = unknown@example.com



Переместить ветку git на другой коммит без вытаскивания
-------------------------------------------------------

.. code-block:: sh

   git branch -f master origin/master

git push во все remote
----------------------

Файл *gitpusha.bat* для windows:

.. code-block:: bat

   @rem # Если поместить этот файл в одну из директорий, прописанных в системной
   @rem # переменной окружения PATH, то можно прямо из любого репозитория
   @rem # вызывать gitpusha [parameters] что будет аналогично
   @rem # запуску git push <remote-name> [parameters] последовательно для всех
   @rem # заданных remote в текущем репозитории

   git remote | xargs -l -t git push %*


Скрипт *gitpusha* для linux:

.. code-block:: sh

   #!/bin/sh

   git remote | xargs -l -t git push "$@"


-------------------------------------
Количество коммитов в git-репозитории
-------------------------------------

Статистика по пользователям
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: sh

   git shortlog --all -s -n

Просто общее количество
^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: sh

   git rev-list --count --all


За период
^^^^^^^^^

.. code-block:: sh

   git rev-list --count --since="Jan 1 2020"  --before="Dec 31 2020" --all


---------------------------------------------
Инициализация сабмодулей по файлу .gitmodules
---------------------------------------------

.. code-block:: sh

   #!/bin/sh

   set -e

   git config -f .gitmodules --get-regexp '^submodule\..*\.path$' |
       while read path_key path
       do
           url_key=$(echo $path_key | sed 's/\.path/.url/')
           url=$(git config -f .gitmodules --get "$url_key")
           git submodule add $url $path
       done

------------------------------------------------------------
Удаление недостижимых объектов из локального репозитория git
------------------------------------------------------------

.. code-block:: sh

   git reflog expire --expire-unreachable=now --all
   git gc --prune=now
   git fsck --unreachable --no-reflogs

------------------
Замена url для git
------------------

Если надо массово заменить URL для всех обращений к репозиториям (например, при работе через какой-либо прокси), 
то достаточно в глобальный .gitconfig или в config репозитория добавить что-то типа такого:

.. code-block:: ini

   [url "ssh://git@127.0.0.1:2222/"]
       insteadOf = git@github.com:


Или, например, чтобы заменить все обращения по https на ssh:

.. code-block:: ini

   [url "git@github.com:"]
       insteadOf = https://github.com/


Само собой, это можно сделать и командой:

.. code-block:: sh

   git config --global url."git@github.com:".insteadOf https://github.com/


----------------------------------------------------
Установка имени пользователя и email для репозитория
----------------------------------------------------

.. code:: bash

   #!/bin/sh
   
   git config user.name myusername
   git config user.email myemail@users.noreply.github.com



