Différences entre les versions de « Aide mémoire d'Arthur pour l'utilisation de Git »

De Wikip
toross>WikiAdmin
m (1 version importée)
 
(2 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 60 : Ligne 60 :


== Configuration ==
== Configuration ==
=== Hosts ===
{{parW|1=
{{m|{{mm|/etc/hosts}}}} n'est pas utilisé mais c'est {{m|{{mm|/c/Windows/System32/drivers/etc/hosts}} }} qui est utilisé.
{{code|lang=hosts|code=
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97    rhino.acme.com          # source server
#      38.25.63.10    x.acme.com              # x client host
# localhost name resolution is handled within DNS itself.
#      127.0.0.1      localhost
#      ::1            localhost
192.168.20.108  hdedibox3
192.168.20.100  compaqmini
}}
}}
=== L'essentiel ===
{{parW|1=
{{parW|1=
*{{mm|git config}}
*{{mm|git config}}
Ligne 71 : Ligne 101 :
:: ⟼ {{mm|<locGitNameRep>/.git/config}}
:: ⟼ {{mm|<locGitNameRep>/.git/config}}
::Seuelement pour la base locale (quand on est dans <locGitNameRep>)
::Seuelement pour la base locale (quand on est dans <locGitNameRep>)
Voir ses paramètres :
{{code|lang=bash|code=
git config --list
}}
}}
=== system ===
ou
{{code|lang=bash|code=
git config core.autocrlf
}}
 
}}
=== system : {{m|1=/etc/git…}} ===
==== Certificat auto-certifié ====
==== Certificat auto-certifié ====
{{parW|1=
{{parW|1=
Ligne 85 : Ligne 124 :
</source>
</source>
}}
}}
=== global ===
==== Editer le contenu de la configuration au niveau du system ====
{{parW|1=
{{code|lang=bash|code=
git config --system --edit # /etc/gitconfig
}}
ce qui peut donner sous windows à ({{mm|/etc/gitconfig}}) :
{{code|lang=cfg|code=
[diff "astextplain"]
        textconv = astextplain
[filter "lfs"]
        clean = git-lfs clean -- %f
        smudge = git-lfs smudge -- %f
        process = git-lfs filter-process
        required = true
[http]
        sslBackend = openssl
        sslCAInfo = C:/pf/git/mingw64/ssl/certs/ca-bundle.crt
        sslVerify = false
[core]
        fscache = false
        symlinks = false
[pull]
        rebase = true
[credential]
        helper = manager-core
[credential "https://dev.azure.com"]
        useHttpPath = true
[init]
        defaultBranch = master
}}
old:
{{code|lang=cfg|code=
[diff "astextplain"]
        textconv = astextplain
[filter "lfs"]
        clean = git-lfs clean -- %f
        smudge = git-lfs smudge -- %f
        process = git-lfs filter-process
        required = true
[http]
        sslBackend = openssl
        sslCAInfo = C:/pf/git/mingw64/ssl/certs/ca-bundle.crt
        sslVerify = false
[core]
        autocrlf = true
        fscache = true
        symlinks = false
[pull]
        rebase = true
[credential]
        helper = manager-core
[credential "https://dev.azure.com"]
        useHttpPath = true
[init]
        defaultBranch = master
[diff]
        tool = diff -Bb
}}
}}
 
=== global : {{m|1=~/.git…}} ===
==== Identification de l'utilisateur ====
==== Identification de l'utilisateur ====
{{parW|1=
{{parW|1=
Ligne 95 : Ligne 194 :
==== Exemple de fichier config ====
==== Exemple de fichier config ====
{{parW|1=
{{parW|1=
<source lang="bash">
{{code|lang=bash|code=
more ~/.gitconfig
git config --edit --global # ~/.gitconfig
</source>
}}
{{code|lang=ini|code=
[http]
        sslVerify = false
[user]
        name = Arthur Torossian
        email = arthur.torossian@edf.fr
[credential "https://at.bht.fr"]
        provider = generic
[credential "http://pac-ad-edf.proxy.edf.fr:3131"]
        provider = generic
[credential "https://git.forge.pleiade.edf.fr"]
        provider = generic
[core]
        attributesfile = C:/Users/C07138/.gitattributes_global
        excludesfile = C:/Users/C07138/.gitignore_global
        ignorecase = true
        attributesfile = C:/Users/C07138/.gitattributes_global
        whitespace = trailing-space,-space-before-tab,indent-with-non-tab,cr-at-eol
        blank-at-eof = false
}}
}}
}}
{{parW|1=
{{parW|1=
<source lang="ini">
Old:
{{code|lang=ini|code=
[http]
[http]
         sslVerify = false
         sslVerify = false
Ligne 116 : Ligne 237 :
         ignorecase = true
         ignorecase = true
         attributesfile = C:/Users/C07138/.gitattributes_global
         attributesfile = C:/Users/C07138/.gitattributes_global
         whitespace = cr-at-eol
         whitespace = trailing-space,-space-before-tab,indent-with-non-tab,cr-at-eol
        autocrlf = false
         blank-at-eof = false
         blank-at-eof = false
</source>
}}
}}
}}


==== Las attributs .gitattributes ====
==== Las attributs .gitattributes - fin de ligne CR LF CRLF LFCR line endings ====
{{parW|1=
{{parW|1=
Pour régler les problèmes d'espace, de tabulation ou de code de fin de ligne des fichiers textes il faut ajouter la configuration des attributs des formats des fichiers (voir ci-après) et configurer les deux variables suivantes localement comme ici ou globalement :
{{code|lang=bash|code=
git config core.eol lf
git config core.autocrlf input
}}
{{CadreR|1=Si des fichiers sont marqués modifiés pour les problèmes d'espaces et de fin de lignes alors il
faut les ajouter et commiter, après quoi le bonne configuration se mettront en place :
{{code|lang=bash|code=
git add -u
git commit -m "nomralisation eof whitespace"
}}
}}
voir :
* [https://stackoverflow.com/questions/9976986/force-lf-eol-in-git-repo-and-working-copy Force LF eol in git repo and working copy]
* [https://git-scm.com/book/en/v2 Pro Git book 2nd Edition (2014)]
* [https://docs.github.com/fr/get-started/getting-started-with-git/configuring-git-to-handle-line-endings#refreshing-a-repository-after-changing-line-endings Configuration de Git pour traiter les fins de ligne]
* [https://git-scm.com/docs/gitattributes gitattributes]
* [https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes 8.2 Customizing Git - Git Attributes]
On peut le configurer en global ou en local {{mm|.gitattributes}} crée à la racine en le versionnant dans la base même si l'on veut le retrouver sur d'autres machines.
{{code|lang=bash|code=
{{code|lang=bash|code=
git config --global core.attributesfile ~/.gitattributes_global
git config --global core.attributesfile ~/.gitattributes_global  
}}
}}
Contenu possible :
 
Contenus possible :
{{code|lang=text|code=
{{code|lang=text|code=
#* text=auto # see : autocrlf = false
* text=auto
*.bat    text eol=crlf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.csv    text
*.doc    -text diff
*.docx  -text diff
*.html  text
*.idx    -text diff
*.ini    text
*.jpg    -text diff
*.mov    -text diff
*.mp4    -text diff
*.pack  -text diff
*.pdf    -text diff
*.png    -text diff
*.ppt    -text diff
*.pptx  -text diff
*.py    text  eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=python
*.pyc    -text diff
*.sample -text diff
*.sh    text whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=bash
*.svg    text
*.tx    text
*.txt    text
*.uml    -text diff
*.xls    -text diff
*.xlsm  -text diff
*.xlsx  -text diff
*.xml    text
}}
}}
voir(old) [https://stackoverflow.com/questions/1510798/trying-to-fix-line-endings-with-git-filter-branch-but-having-no-luck/1511273#1511273 Trying to fix line-endings]
}}
}}
==== Ignorer les fichiers .gitignore ====
==== Ignorer les fichiers .gitignore ====
{{parW|1=
{{parW|1=
Ligne 158 : Ligne 330 :
tmp*
tmp*
gen*
gen*
old*
external*
external*
*generated*
*generated*
Ligne 180 : Ligne 353 :
*.so
*.so
*.pyc
*.pyc
 
__pycache__
# Packages #
# Packages #
############
############
Ligne 210 : Ligne 383 :
}}
}}
{{Rq|Ne pas laisser d'espace devant les pattern de filtrage.}}
{{Rq|Ne pas laisser d'espace devant les pattern de filtrage.}}
=== Local :  {{m|1=.git/config}} ===
{{parW|1=
{{code|code=bash|code=
git config --edit # .git/config
}}
{{code|code=in|code=
[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
[remote "old-origin"]
        url = https://git.forge.pleiade.edf.fr/git/verona.colmat.git
        fetch = +refs/heads/*:refs/remotes/old-origin/*
[gui]
        wmstate = zoomed
        geometry = 893x435+208+208 418 464
[submodule "modAtTool"]
        active = true
        url = https://git.forge.pleiade.edf.fr/git/verona.git
[remote "at64g"]
        url = F:/base/gitDvlp/ciclope.git/
        fetch = +refs/heads/*:refs/remotes/at64g/*
[remote "origin"]
        url = https://gitlab.pleiade.edf.fr/ciclope/ciclope-code.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
[http]
        sslVerify = false
}}
}}


=== La complétion des commandes de git ===
=== La complétion des commandes de git ===
Ligne 227 : Ligne 435 :
}}
}}


=== Les outils : éditeur et fusion et différence  ===
=== Les outils : éditeur et fusion et différence (diff tool merge tool meld tkdiff) ===
{{parW|1=
{{parW|1=
{{cadre|1=
Pour travailler sous windows et linux sans les problèmes de fin de ligne \lf \cr il suffit de positionner {{mm|core.autocrlf}} sur {{mm|input}} [https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration source]:
{{code|lang=bash|code=
git config --global core.autocrlf input
}}
}}
<source lang="bash">
<source lang="bash">
git config --global core.editor gedit
git config --global core.editor gedit
Ligne 331 : Ligne 545 :
{{parW|1=
{{parW|1=
<source lang="bash">
<source lang="bash">
git config --list
git config --list --show-origin 
git config user.name
git config user.name
</source>
</source>
Ligne 456 : Ligne 670 :
git clone <remGitNameUrl>  <locGitNameRep>
git clone <remGitNameUrl>  <locGitNameRep>
</source>
</source>
Cette commande créera la répertoire <GitName>.
Cette commande créera la répertoire <locGitNameRep>.
}}
==== Cloner une branche ou un tag particulier ====
{{parW|1=
{{code|lang=bash|code=
# pour une branche
git clone -b <branchName> <remGitNameUrl>  <locGitNameRep>
# ou pour un tag
git clone -b <tagName> <remGitNameUrl>  <locGitNameRep>
}}
Cette commande créera la répertoire <locGitNameRep>.
}}
}}
=== Pour une base locale existante modifier l'emplacement du répertoire {{dq|.git}} ===
=== Pour une base locale existante modifier l'emplacement du répertoire {{dq|.git}} ===
{{parW|1=
{{parW|1=
Ligne 1 033 : Ligne 1 258 :
==== Voir l'historique - git-log ====
==== Voir l'historique - git-log ====
{{parW|1=
{{parW|1=
La doc en ligne : https://git-scm.com/docs/git-log
* La doc en ligne : [https://git-scm.com/docs/git-log]
D'un fichier donné:
{{code|lang=bash|code=
git log --pretty=format:"%h %cd %Cgreen%s %Cred%d" \
        --graph  --abbrev-commit  --date="format:%Y/%m/%d %Hh%M" \
        --follow ciclopeM3z.py
}}
Globalement:
{{code|lang=bash|code=
{{code|lang=bash|code=
# court
# court
Ligne 1 322 : Ligne 1 554 :
* Les commandes GIT que vous devez absolument connaître !
* Les commandes GIT que vous devez absolument connaître !
*: https://www.hostinger.fr/tutoriels/commandes-git/
*: https://www.hostinger.fr/tutoriels/commandes-git/
* Gloassary - Git commands
*: https://www.atlassian.com/git/glossary
* git-cheatsheet
* git-cheatsheet
*: http://ndpsoftware.com/git-cheatsheet.html
*: http://ndpsoftware.com/git-cheatsheet.html
Ligne 1 362 : Ligne 1 596 :
*: [http://mercurial.selenic.com/wiki/GitConcepts mercurial.selenic.com]
*: [http://mercurial.selenic.com/wiki/GitConcepts mercurial.selenic.com]
}}
}}
=== Clients ===
=== Clients ===
{{parW|1=
{{parW|1=

Version actuelle datée du 26 décembre 2023 à 11:26

Version : 1.36.1 4513 (2023-12-26) 20231226112618

1 L'essentiel

GitFlowDiagram.svg
Fig. n°1 Diagramme de flux de git

2 Las variables

<rem…> remote
distant, une base git distante, sur une autre machine
<loc…> local
local, une base git locale, sur la machine utilisée
<dep…> depository
depository (repository ne sera pas utilisé pour ne pas confondre avec repertoire)
<wrk…> work
work, de travail, ce qui correspond en général au répertoire de travail
<…Url> url
uniform resource locator, adresse web d'une base git
<…Dir> <…Rep> directory
répertoire physique sur le disque dur.
<…ParentDir> <…ParentRep> parent directory
répertoire parent sur le disque dur.
<…GitName…>
nom de la base git
exa-1

3 Les différentes espaces de Git

stash        wrkDir        stgArea        locDep        remDep

3.1 stash

L'espace stash (stash) (cachette) est une espace de stockage temporaire des données qui ne sont pas encore enregistrées (not commited); c'est une sauvegarde de l'espace staging area.

3.2 staging area - index

L'espace staging area (stgArea) est une espace de stockage des données qui ne sont pas encore enregistrées (not commited).

3.3 working directory

L'espace working directory (wrkDir) est un répertoire sur un système de fichier qui contient les fichiers de travails. Tous les fichiers et sous répertoires ne sont pas forcément versionnés.

3.4 local depository

L'espace local depository (locDep) est une espace de stockage des données versionnées, une base de données git, qui se trouve dans le répertoire nommé .git qui lui même est dans le répertoire racine de working directory. Ces données sont enregistrées (commited).

3.5 remote depository

L'espace remote depository (remDep) est une espace de stockage des données versionnées, une base de données git, qui n'est pas le répertoire nommé .git de working directory. Il est soit sur le même système de fichier ou sur une autre machines. Ces données sont enregistrées (commited and pushed). Un espace (locDep peut avoir plusieurs (remDep.

4 Configuration

4.1 Hosts

/etc/hosts n'est pas utilisé mais c'est /c/Windows/System32/drivers/etc/hosts qui est utilisé.

# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
#       127.0.0.1       localhost
#       ::1             localhost
192.168.20.108  hdedibox3
192.168.20.100  compaqmini

4.2 L'essentiel

  • git config
  • --system
/etc/gitconfig
Pour tous les utilisateurs
  • --global
~/.gitconfig
Pour l'utilsateur courant
<locGitNameRep>/.git/config
Seuelement pour la base locale (quand on est dans <locGitNameRep>)

Voir ses paramètres :

git config --list

ou

git config core.autocrlf

4.3 system : /etc/git…

4.3.1 Certificat auto-certifié

Solution 1 :

su -
git config --system http.sslVerify false

Solution 2 :

export GIT_SSL_NO_VERIFY=true

4.3.2 Editer le contenu de la configuration au niveau du system

git config --system --edit # /etc/gitconfig

ce qui peut donner sous windows à (/etc/gitconfig) :

[diff "astextplain"]
        textconv = astextplain
[filter "lfs"]
        clean = git-lfs clean -- %f
        smudge = git-lfs smudge -- %f
        process = git-lfs filter-process
        required = true
[http]
        sslBackend = openssl
        sslCAInfo = C:/pf/git/mingw64/ssl/certs/ca-bundle.crt
        sslVerify = false
[core]
        fscache = false
        symlinks = false
[pull]
        rebase = true
[credential]
        helper = manager-core
[credential "https://dev.azure.com"]
        useHttpPath = true
[init]
        defaultBranch = master

old:

[diff "astextplain"]
        textconv = astextplain
[filter "lfs"]
        clean = git-lfs clean -- %f
        smudge = git-lfs smudge -- %f
        process = git-lfs filter-process
        required = true
[http]
        sslBackend = openssl
        sslCAInfo = C:/pf/git/mingw64/ssl/certs/ca-bundle.crt
        sslVerify = false
[core]
        autocrlf = true
        fscache = true
        symlinks = false
[pull]
        rebase = true
[credential]
        helper = manager-core
[credential "https://dev.azure.com"]
        useHttpPath = true
[init]
        defaultBranch = master
[diff]
        tool = diff -Bb

4.4 global : ~/.git…

4.4.1 Identification de l'utilisateur

git config --global user.name "Arthur TOROSSIAN"
git config --global user.email "arthur.torossian@edf.fr"

4.4.2 Exemple de fichier config

git config --edit --global # ~/.gitconfig
[http]
        sslVerify = false
[user]
        name = Arthur Torossian
        email = arthur.torossian@edf.fr
[credential "https://at.bht.fr"]
        provider = generic
[credential "http://pac-ad-edf.proxy.edf.fr:3131"]
        provider = generic
[credential "https://git.forge.pleiade.edf.fr"]
        provider = generic
[core]
        attributesfile = C:/Users/C07138/.gitattributes_global
        excludesfile = C:/Users/C07138/.gitignore_global
        ignorecase = true
        attributesfile = C:/Users/C07138/.gitattributes_global
        whitespace = trailing-space,-space-before-tab,indent-with-non-tab,cr-at-eol
        blank-at-eof = false

Old:

[http]
        sslVerify = false
[user]
        name = Arthur Torossian
        email = arthur.torossian@edf.fr
[credential "https://at.bht.fr"]
        provider = generic
[credential "http://pac-ad-edf.proxy.edf.fr:3131"]
        provider = generic
[credential "https://git.forge.pleiade.edf.fr"]
        provider = generic
[core]
        excludesfile = C:/Users/C07138/.gitignore_global
        ignorecase = true
        attributesfile = C:/Users/C07138/.gitattributes_global
        whitespace = trailing-space,-space-before-tab,indent-with-non-tab,cr-at-eol
        blank-at-eof = false

4.4.3 Las attributs .gitattributes - fin de ligne CR LF CRLF LFCR line endings

Pour régler les problèmes d'espace, de tabulation ou de code de fin de ligne des fichiers textes il faut ajouter la configuration des attributs des formats des fichiers (voir ci-après) et configurer les deux variables suivantes localement comme ici ou globalement :

git config core.eol lf
git config core.autocrlf input

Si des fichiers sont marqués modifiés pour les problèmes d'espaces et de fin de lignes alors il faut les ajouter et commiter, après quoi le bonne configuration se mettront en place :

git add -u
git commit -m "nomralisation eof whitespace"

voir :

On peut le configurer en global ou en local .gitattributes crée à la racine en le versionnant dans la base même si l'on veut le retrouver sur d'autres machines.

git config --global core.attributesfile ~/.gitattributes_global


Contenus possible :

* text=auto
*.bat    text eol=crlf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.csv    text 
*.doc    -text diff
*.docx   -text diff 
*.html   text 
*.idx    -text diff 
*.ini    text
*.jpg    -text diff
*.mov    -text diff 
*.mp4    -text diff
*.pack   -text diff
*.pdf    -text diff
*.png    -text diff
*.ppt    -text diff
*.pptx   -text diff
*.py     text  eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=python
*.pyc    -text diff
*.sample -text diff
*.sh     text  whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=bash
*.svg    text
*.tx     text
*.txt    text
*.uml    -text diff 
*.xls    -text diff
*.xlsm   -text diff
*.xlsx   -text diff
*.xml    text
voir(old) Trying to fix line-endings

4.4.4 Ignorer les fichiers .gitignore

Ajouter le ~/.gitignore_global aux fichiers exclus en tapant, y compris sous WINDOWS:

git config --global core.excludesfile ~/.gitignore_global

Rendre la configuration non sensible à la casse :

git config --global core.ignorecase true

cette option se retrouve alors dans le fichier wrkDir/.git/config Pour un répertoire spécifique, créer ce fichier nommé .gitignore dans le répertoire à filtrer (en général la racine qui est wrkDir) en le complétant par :

.gitignore
.project
.pydevproject
.settings
noPull
noPush
*chenal3.cfg*
modAtTool

# My generated #
###################
tmp*
gen*
old*
external*
*generated*
*Copie*
*Copy*
*.puml
*PlantUml.png

# Editor generted #
###################
*~
*bak
*back.py

# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so
*.pyc
__pycache__
# Packages #
############
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip

# Logs and databases #
######################
*.log

# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
Rqe-1

Ne pas laisser d'espace devant les pattern de filtrage.

4.5 Local : .git/config

git config --edit # .git/config
[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
[remote "old-origin"]
        url = https://git.forge.pleiade.edf.fr/git/verona.colmat.git
        fetch = +refs/heads/*:refs/remotes/old-origin/*
[gui]
        wmstate = zoomed
        geometry = 893x435+208+208 418 464
[submodule "modAtTool"]
        active = true
        url = https://git.forge.pleiade.edf.fr/git/verona.git
[remote "at64g"]
        url = F:/base/gitDvlp/ciclope.git/
        fetch = +refs/heads/*:refs/remotes/at64g/*
[remote "origin"]
        url = https://gitlab.pleiade.edf.fr/ciclope/ciclope-code.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
[http]
        sslVerify = false

4.6 La complétion des commandes de git

Copier le fichier de complétion:

cp /etc/bash_completion.d/git ~/.git-completion.sh

et ajouter dans ~/.bashrc la ligne suivante :

source ~/.git-completion.sh

4.7 Un prompt affichant les branches

A mettre dans .bashrcExemples de .bashrc

4.8 Les outils : éditeur et fusion et différence (diff tool merge tool meld tkdiff)

Pour travailler sous windows et linux sans les problèmes de fin de ligne \lf \cr il suffit de positionner core.autocrlf sur input source:

git config --global core.autocrlf input
git config --global core.editor gedit
git config --global merge.tool tkdiff
git config --global diff.tool meld
git config --global difftool.meld.path "/usr/bin/meld"
git config --global difftool.prompt false
git config --global merge.tool meld
git config --global mergetool.meld.path "/usr/bin/meld"
git config --global mergetool.prompt false

Utilisation

git difftool  HEAD^1 comMultiZone/common.py

4.9 Dimensionner la taille des paquets d'envoi quand le protocole http est utilisé

SI le massage suivant est ertourné :

Expected ok/error, helper said 2004[...]
git config --global http.postBuffer 209715200

4.10 Le fichier bashrc pour git bash sous windows

Se trouve dans C:\Users\<your user name>.

Si on exécute la commande echo ~ on obtient par exemple « /c/Users/Arthur »

4.11 Les alias

Lire d'abord Exemple de référence

alias gad='git add '
..
git config --global alias.sw   'checkout'
git config --global alias.ad   'add'
git config --global alias.br   'branch'
git config --global alias.cm   'commit' -m 
git config --global alias.co   'checkout'
git config --global alias.cur  'symbolic-ref --short HEAD'
git config --global alias.lg   'log  --pretty=format:"[%h][%cN]%Cgreen[%s]%Cred[%d]" --date=iso  --graph  --abbrev-commit'
git config --global alias.ltag 'describe --exact-match --abbrev=0'
git config --global alias.pl   'pull'
git config --global alias.pu   'push'
git config --global alias.slg  'log  --pretty=format:"[%h]%Cgreen[%s]%Cred[%d]" --graph  --abbrev-commit'
git config --global alias.st   'status'
git config --global alias.sw   'checkout'
git config --global alias.rv  ' remote -v '
git config --global alias.ra  'remote add '
git config --global alias.me  'merge --no-ff --no-commit'

Dautres alias plus spécifiques

alias branch-merge-point = !bash -c 'diff --old-line-format=--new-line-format= <(git rev-list --first-parent \"${1:-master}\") <(git rev-list --first-parent \"${2:-HEAD}\")

git config -l |grep alias
alias.le=log --oneline --decorate
alias.filelog=log -u
alias.fl=log -u
alias.dl=!git ll -1
alias.dlc=diff --cached HEAD^
alias.dr=!f() { git diff $1^..$1; }; f
alias.lc=!f() { git ll $1^..$1; }; f
alias.diffr=!f() { git diff $1^..$1; }; f
alias.f=!git ls-files | grep -i
alias.grep=grep -Ii
alias.gr=grep -Ii
alias.cp=cherry-pick
alias.st=status -s
alias.cl=clone
alias.ci=commit
alias.co=checkout
alias.br=branch
alias.diff=diff --word-diff
alias.dc=diff --cached
alias.r=reset
alias.r1=reset HEAD^
alias.r2=reset HEAD^^
alias.rh=reset --hard
alias.rh1=reset HEAD^ --hard
alias.rh2=reset HEAD^^ --hard

4.12 Vérifier la configuration

git config --list --show-origin  
git config user.name

5 Aide

git <commande> -h
man git-<commande>
git help <commande>
git --help <commande>

exemple :

git config -h
man git-config
git help config
git --help config

6 Les commandes les plus utilisées

Not-1

cp : copier(copy)

Not-2

mv : déplacer(mv)

Not-3

rec : enregistrer(record), inscrire juste le nom

Not-4

unrec : dés-enregistrer(unrecord), effacer le nom

6.1 Désigner une révision - HEAD

  • HEAD désigne la dernière révision, notée N, de la branche pointée par le locRep.
  • HEAD~ ou HEAD^ ou HEAD~1 HEAD^1 désigne la révision N-1.
  • HEAD~2 désigne la révision N-2.
  • HEAD^2 désigne la révision N-2 du deuxième parent dans le cas où on peut avoir plusieurs parents.
  • ORIG_HEAD est l'état antérieur de HEAD pour certaines opérations critiques. Il est moins utile maintenant que git a reflog: git reflog show donne par exemple :
    febdfb9 (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: checkout: moving from at to master
    010837a (origin/at, at) HEAD@{1}: checkout: moving from master to at
    febdfb9 (HEAD -> master, origin/master, origin/HEAD) HEAD@{2}: commit: save
    010837a (origin/at, at) HEAD@{3}: pull: Fast-forward
    
Rqe-2

Les révisions sont aussi appelées des « commit ». Par exemple HEAD^1 désigne le dernier « commit » (last commit). Dans la documention de git les « commit » sont noté « <commit> ».


exemples :

git lg  HEAD~1^2
git lg  origin/master~1
git log  --pretty=format:"%h"   --graph
*   1bd1d09
|\  
| *   37d48e9
| |\  
| | * edae2b9
| | * 42bb57e
| |/  
|/|   
| * 74dc61f
| * c43c75d
|/  
* eedbf2e
* 0361888
* 87c79ea
git lg -1 HEAD~1
* eedbf2e
git lg -1 HEAD^1
* eedbf2e
git lg -1 HEAD~2
* 0361888
git lg -1 HEAD^2
37d48e9

6.2 S'authentifier aévec mot de passe stocké temporairement

Pour garder le mot de passe pour 3 heures

git config --global credential.helper 'cache --timeout=10800'

Pour garder le mot de passe pour une heure

git config --global credential.helper 'cache --timeout=3600'

Pour garder le mot de passe pour un certain temps

git config --global credential.helper cache


Sous windows (pas possible de mettre un timeout):

git config --global credential.helper wincred

Si vous êtes bloqué sous windows, on peut gérer les dientifications en cherchant dans tapant « Gérer vos informations d'identification »

Rqe-3

Attention dans certain cas par défaut le paramétrage peut être dans --system.

6.3 Copier une base locale - clone

git clone <remGitNameUrl>  <locGitNameRep>
Cette commande créera la répertoire <locGitNameRep>.

6.3.1 Cloner une branche ou un tag particulier

# pour une branche
git clone -b <branchName> <remGitNameUrl>  <locGitNameRep>
# ou pour un tag
git clone -b <tagName> <remGitNameUrl>  <locGitNameRep>
Cette commande créera la répertoire <locGitNameRep>.

6.4 Pour une base locale existante modifier l'emplacement du répertoire « .git »

Utilisation de « --separate-git-dir »

git clone <remGitNameRep> <locGitNameRep> \
                 --separate-git-dir=<newPathOfLocGitRep>

Exemple :

git clone /c/chenal3/chenal /c/chenal3/newChenal \
                 --separate-git-dir=/c/chenal3/newChenalGitRep

6.5 Ajouter/Add un fichier au «stgArea»

git add <filepath>
git add <dirpath>
git add ./rep1/dvlp1File.txt


Seulement les éléments déjà ajoutés:

git add -u [--] [filepattern ...]
git add -u 
git add -u "*.c" "../*.h"


Tous les éléments:

git add -A [--] [filepattern ...]
git add -A 
git add -A "*.c" "../*.h"

Attention git add -A supprimera dans stgArea les fichiers qui ne sont plus dans wrkDir. Attention git add -n permet de tester sans toucher stgArea, très pratique si l'on n'est pas sûr, exemple git add -n -A "../ser*" "../inter*".

stash        wrkDir        stgArea    locDep   remDep
                └────rec──────▶│
                   "add" ou "add -u"        

stash        wrkDir        stgArea    locDep   remDep
                └────rec──────▶│
                              some
                               └unrec─▶∅
                   "add -A"

6.6 Montrer les différences et comparer

Entre deux tags :

git diff tag1 tag2
git diff tag1 tag2 -- some/file/name


Pour ne voir que la liste des fichiers qui comportent des différences:

git diff tag1 tag2 --stat


Pour une différence avec le répertoire courant:

git diff tagX
git diff tagX -- some/file/name
git diff tagX  --stat

6.7 Enregistrer/Commiter les fichiers déjà ajoutés dans «locDep»

git commit -m <message>
git commit -m "dvlp01-01"


stash        wrkDir        stgArea    locDep   remDep
                │             └unrec─▶∅
                └───────────cp───────────▶<newSha1>
                                          <sha1>
                                           ...
                    "commit -m <message>"


6.8 Annuler

6.8.1 Annuler un ajout d'un fichier au «stgArea» - “unadd” - "reset <path>"

git reset <filepath>
git reset HEAD <filepath>

« wrkDir » n'est pas impacté.

stash        wrkDir        stgArea    locDep   remDep
                     ∅◀─unrec─┘ 
                         "reset <path>"

6.8.2 Annuler/Uncommiter le dernier enregistrement dans « locDep »

git reset --soft HEAD^


« wrkDir » et « stgArea » ne sont pas impactés.

stash        wrkDir        stgArea    locDep   remDep

                                ∅◀─mv─<HEAD>
                                       <HEAD^>
                                        ...

                                  "reset --soft HEAD^"
Rqe-4

La commande git reset --soft HEAD ne fait rien

6.8.3 Annuler/Uncommits plusieurs enregistrements dans « locDep »

git reset --soft HEAD^^^
git reset --soft dba146f


« wrkDir » et « stgArea » ne sont pas impactés.

stash        wrkDir        stgArea    locDep   remDep

                              ∅◀─mv─ <HEAD>  
                              ∅◀─mv─ <HEAD^>  
                              ∅◀─mv─ <HEAD^^>  
                                     <HEAD^^^>=<Commit>
                                        ...   

                         "reset --soft <Commit>"

6.8.4 Annuler/unLocalyModify toutes les modifications dans « wrkDir »

git reset --hard
git reset --hard HEAD


« wrkDir » et « stgArea » sont directement impactés.

stash        wrkDir        stgArea    locDep    remDep
               │     ∅◀─unrec─┘  
               │◀───────────cp────────<HEAD>  
                                       ...   

                    "reset --hard HEAD"

6.8.5 Annuler/unLocalyModify les modifications d'un fichier dans « wrkDir »

git checkout HEAD Makefile



stash        wrkDir        stgArea    locDep    remDep
               │     ∅◀─unrec─┘  
               │◀───────────cp────────<HEAD>  
                                       ...   

                    "git checkout HEAD Makefile"

6.9 Dépôt distant

6.9.1 Changer le dépôt distant « origin »

git remote rename origin origin-old
git remote add origin git@gitlab.pleiade.edf.fr:eelCounter/eelCounter.git
git branch --set-upstream-to=origin/master master

6.9.2 Connaître l'url de la base distante - remote

git remote -v
origin	<remGitNameUrl>  (fetch)
origin	<remGitNameUrl>  (push)

6.9.3 Ajouter un dépôt distant - remote add

remoteName est nom (une variable) correspondant à la base distante

git remote add <remoteName> <path>
git remote add <remoteName> <remotePath>
git remote add <remoteName> <localPath>
git remote add <remoteName> <url>

cas distant :

git remote add claumep1 http://claumep1.der.edf.fr/git/P112N_pivot.git
git remote add atorossClaui2v9 ssh://atoross@claui2v9.der.edf.fr/local01/atoross/dvlp/vishnu/github_vishnu.git


git pull <remoteName> [<remoteBranchName>]


git pull atorossClaui2v9 zmq

cas local:

git remote add theTrunk /home/C07138/opentelemacTrunk

git remote -v
git branch 

git stash 
git pull theTrunk master

git pull theTrunk master

git branch gouttedo
git branch 
git checkout gouttedo 

git pull theTrunk gouttedo

6.9.4 Enlever un dépôt distant - remote rm

git remote rm claui2v6

6.9.5 Inspecter un dépôt distant - remote -v show

git remote -v show <remoteName>

Example :

git remote -v show origin

6.10 Merger

6.10.1 Merger une branche (locale) dans la branche courante

git merge multiZoneDvlp

6.10.2 Merger seulement des fichiers d'une branche dans la branche courante

git merge --no-ff --no-commit <branch>
git status
git merge --no-ff --no-commit at
git status
  • --no-ff : pas de fast-forward
  • --no-commit : pas de commit

Vous aurez alors une liste de fichiers automatiquement fusionnés(merged) et d'autres avec des fusions comportant des conflits.

Pour les fichiers auto-fusionnés on peut inspecter le fusion avec la commande :

git diff --cached <filepath>


Pour fusions avec conflit il faut les éditer et faire le choix soi-même, sinon on peut choisir entre la branche et la branche courante.

Choix de la branche courante :

git checkout HEAD <filepath>


Choix de la branche à fusionner :

git checkout <branch>  <filepath>

6.10.3 Merger une branche distante - branch merge

git checkout master
git branch -a -v
git merge remotes/origin/BOU/addStudyExamples

6.10.4 gérer les conflits lors des merges/fusions

Le cas imprévu :

git pull lex256 master
git checkout --theirs facture/facture.ods
git add -facture/facture.ods
git pull lex256

Le cas prévisible :

git pull -s ours
git pull -X theirs

6.11 Branches

6.11.1 Supprimer une branche

exemple :

git branch -d sph_rpa-1.0.0.0
git branch -D sph_rpa-1.0.0.0 # sans confirmation

6.11.2 Lister les branches - fetch, branch

exemple :

git fetch -p
git branch -a -v

6.11.3 Récupérer / changer une branche distante - fetch, checkout --track

git fetch <remoteName>
git checkout --track <remoteName>/<remoteBrancheName>

exemple :

git fetch -p
git branch -a -v
git checkout remotes/origin/BOU/addStudyExamples

6.11.4 Créer une nouvelle branche - branch

git branch <newBranchName> <refBranchName> 
git branch v0.1 master
git checkout v0.1
git push origin at/v0.1

6.11.5 Partager une nouvelle branche - push <remoteName> <xx>/<topic>

git branch <xx>/<topic>
git co <xx>/<topic> 
git branch
...
git push <remoteName> <xx>/<topic>

6.11.6 Renomer une branche - git branch -m <new-name>

6.11.6.1 Rename your local branch

If you are on the branch you want to rename:

git branch -m new-name

If you are on a different branch:

git branch -m old-name new-name
6.11.6.2 Delete the old-name remote branch and push the new-name local branch
git push origin :old-name new-name
6.11.6.3 Reset the upstream branch for the new-name local branch
git push origin -u new-name

6.12 Tag

6.12.1 Taguer une version d'application (pushable)

git tag -a  cloggingGridModel_rpa-1.0.0 -m "cloggingGridModel version rpa-1.0.0"

6.12.2 Le dernier commit - tag -s -a v0.1 -m "FPL 0.1"

Préparer une clé gpg

gpg --gen-key
gpg --list-keys


Real name: Arthur Torossian
Email address: arthur.torossian@edf.fr
You selected this USER-ID:
    "Arthur Torossian <arthur.torossian@edf.fr>"


/home/atoross/.gnupg/pubring.gpg
--------------------------------
pub   3072D/DDDFB557 2013-07-05
uid                  Arthur Torossian <arthur.torossian@edf.fr>
sub   3072g/999BED15 2013-07-05



Il faut créer de tag avec annotation sinon le tag est lightweight dans ce cas c'est juste un pointeur sur le nœud du commit.

git tag -s -a v0.1 -m "FPL 0.1"
git tag -v v0.1
git show v0.1



L'option -s permet de signer avec le mail comme clé.

6.12.3 Un ancien commit - tag -s -a v0.1 -m "FPL 0.1" 979e98c

git tag -s -a "ciclope.py_x5-1.2.0.1" -m "ciclope.py version x5-1.2.0.1" 979e98c

6.12.4 Lister les tags sans notations (lightweight tags, annotated tags)

git for-each-ref refs/tags/ --format '%(objecttype) %(refname:short)'

6.12.5 Un ancien commit - tag -s -a v0.1 9fceb02

git tag -s -a v0.1 9fceb02

6.12.6 Partager les tags - push origin v0.1

git push origin v0.1

ou

git push origin --tags

6.12.7 Supprimer un tag local

git tag -d alpha-3.0.0.0

6.12.8 Supprimer un tag distant

git push --delete origin alpha-3.0.0.0

6.13 Chercher (find) un mot/expression dans un fichier dans toutes les versions

git rev-list --all

6.14 Supprimer

6.14.1 Supprimer un répertoire - rm -r fuelCell

git rm -r  fuelCell
git rm -r lightModel   airportsTraffic

6.14.2 Supprimer un répertoire / fichier dans toute l'historique - git filter-branch -f --tree-filter

git filter-branch -f --tree-filter "rm -rf  ./donnees/studyExamples  " --prune-empty -- --all
git push --force

6.15 Sous base ou module

6.15.1 Organisation

Pour l'instant il n'y pas moyen d'ajouter plusieurs dépôts pour un sous module. Dans ce cas il vaut mieux ajouter un dépôt local avec un chemin relatif (exemple : ../modAtTool) et ainsi on pourra gérer les dépôts distants depuis la base locale.

6.15.2 Ajouter un sous module - une autre base git dans un sous répertoire

git submodule add  https://git.forge.pleiade.edf.fr/git/verona.git modAtTool

Il faut tout de suite configurer la liaison avec une branche par exemple ici ciclope. Ainsi chaque utilisateur du module a sa propre version.

git config -f .gitmodules submodule.modAtTool.branch ciclope

6.15.3 Configurer la branche du sous module

git config -f .gitmodules submodule.modAtTool.branch ciclope
more .gitmodules
[submodule "modAtTool"]
	path = modAtTool
	url = https://git.forge.pleiade.edf.fr/git/verona.git
	branch = ciclope

6.15.4 Récuprer un sous module - puller un sous module

La première fois :

git submodule update --init --recursive

Après on peut utiliser la commande pull lui-même :

git pull --recurse-submodules

6.15.5 Changer l'url du sous module

git config --file=.gitmodules submodule.modAtTool.url ../modAtTool
git config --file=.gitmodules submodule.modAtTool.branch chenal3
git submodule sync
git submodule update --init --recursive --remote

6.15.6 Renommer un sous module

git mv modAtTool/ modExtTool
gcm "rename extern tool"

6.15.7 Supprimer un sous module

git rm modExtTool
gcm "delete extern tool"

6.15.8 Cloner une base avec les sous modules

Pour une version ≥ 2.13 :

git clone --recurse-submodules  https://...myBase.git myBase

6.15.9 Voir l'historique - git-log

  • La doc en ligne : [1]

D'un fichier donné:

git log --pretty=format:"%h %cd %Cgreen%s %Cred%d" \
        --graph  --abbrev-commit  --date="format:%Y/%m/%d %Hh%M" \
        --follow ciclopeM3z.py

Globalement:

# court
git log --pretty=format:"%h %cd %Cgreen%s %Cred%d" --graph  --abbrev-commit  --date="format:%Y/%m/%d %Hh%M"
# long
$git log --pretty=format:"%h %cd %cn %Cgreen%s %Cred%d" --graph  --abbrev-commit --date="format:%Y/%m/%d %Hh%M"

7 Comment s'organiser

GitCycleGtaph.png
Fig. n°2 le graph

7.1 Créer une nouvelle base

cd <locGitBaseRep>
git init
touch README
git add README
git commit -m "init"
git branch

7.2 Exporter ou archiver hors base - archive

git archive --format=tar HEAD  ./pivotLanguage/ | gzip > test.tar.gz

7.3 Créer un dépôt commun

Sur le serveur distant:

mkdir <remGitBaseRep>
cd <remGitBaseRep>
git init --bare
git update-server-info
cd ..
chown -R www-data:atoross <remGitBaseRep>


L'option --bare évite d'avoir les fichiers locaux de travail.

Sur l'une des machines de travail ou base de travail:

git clone https://claumep1.der.edf.fr/git/hydro myHydro
git br


La commande git br ne renvoie aucune branche. Il faut au minimum ajouter(add) un fichier et enregistrer l'ajout (commit) afin que la branche par défaut master apparaisse :

git add conv.py
git cm -m  "test python file reading med file" conv.py
git br


Cette fois-ci nous avons bien la branche master :

* master

Rqe-5

Je ne sais toujours pas pourquoi il faut ajouter absolument un fichier pour que la branche master puisse exister localement !

Attention tout n'est pas fini

Si on utilise https/http, pour pusher il faut ajouter son login dans .git/config sinon le push ne passe pas !

[remote "origin"]
	url = https://atoross@at.bht.fr/git/atTools.git

Finallement on peut pusher :

git push --set-upstream  origin  master


Pour pouvoir « pusher » et « puller » il faut également ajouter au moins un fichier :

git add readme.txt
gcm "init"
git push

7.4 Le rôle de l'intégrateur

cd integratorLocGitBase/
evim intFile.txt
git add intFile.txt
git cm -m "int-01"
git lg origin/master
git push
git lg origin/master
git add intFile.txt
git cm -m "int-02"
git push
git lg origin/master
git fetch
git co --track origin/ar/topic-u2-01 
git co master
git branch 
git merge ar/topic-u2-01 
#git merge --log --no-ff ar/topic-u2-01 
git push 
git co ar/topic-u2-01 
git pull
more dvlp2File.txt 
git co master
git merge --log --no-ff ar/topic-u2-01 
git push
git config user.name "Integrator"
git config --list
git status
more intFile.txt 
git add intFile.txt
git commit -m "int-03"
git push
git lg origin/master
git remote show origin
git lg
git st
git add intFile.txt
git cm -m "int-04"
git push
git lg
git add intFile.txt
git cm -m "int-05"
git push
git lg
git fetch origin
git co --track origin/at/topic-u1-01 
git br
git status
git br
git sw master
git br
git merge --log --no-ff at/topic-u1-01 
git status
git push
git slg

7.5 Rôle de l'utilisateur 1

cd dvlp1GitBase/
git lg  origin/master
git pull
branch at/topic-u1-01
git sw at/topic-u1-01 
git branch
git add dvlp1File.txt
git status
git cm -m "dvlp01-01"
git lg
branch
push origin at/topic-u1-01 
git co master

7.6 Rôle de l'utilisateur 2

git clone   file:///home/atoross/dvlp/gitTests/remGitBase dvlp2GitBase
cd dvlp2GitBase/
git br ar/topicu2-01
git sw ar/topicu2-01 
git br
git config user.name "Arturo Torossiani"
git pull
git lg
git branch ar/topic-u2-01
git branch
git checkout ar/topic-u2-01 
git branch
git cm -am "dvlp02-01"
git add dvlp2File.txt
git cm -am "dvlp02-01"
git push origin ar/topic-u2-01 
git branch
git cm -am "dvlp02-02"
git push origin ar/topic-u2-01
git lg
more dvlp2File.txt 
git slg

7.6.1 Créer un patch

-<n>
Prepare patches from the topmost <n> commits.

git format-patch master -1


[2]

8 git-svn

9 Mes bases Git

10 Git servi par apache

10.1 Créer une base sans les fichiers locaux - Create a bare repository

bare
nue, sans la partie de travail
cd <remGitNameRep>
git init --bare
git update-server-info

ou à partir d'une base existante

cd <remGitNameParentRep>
git clone --bare <remGitNameUrl> <GitName>.git
git update-server-info

10.2 Configurer apache

on peut ajouter un fichier git :

################################################################################
# git
################################################################################
Alias /git/ "/local01/www/arth/git/"
<Location /git>
    DAV on
    Options -Indexes

    <RequireAll>
    Require all granted
    SSLRequireSSL

    AuthType Basic
    AuthName "Git"
    AuthBasicProvider file
    AuthUserFile "/etc/apache2/passwd/passwords_admin"
    <RequireAll>
        Require valid-user
    </RequireAll>
    </RequireAll>
</Location>
a2ensite git
a2enmod dav
a2enmod dav_fs
/etc/init.d/apache2 restart

Pour terminer il faut lire Créer une base commune distante

11 Problèmes rencontrés

11.1 Manque de mémoire

remote: Counting objects: 11191, done.
remote: warning: suboptimal pack - out of memory
remote: fatal: Out of memory, malloc failed (tried to allocate 348936731 bytes)
remote: aborting due to possible repository corruption on the remote side.
fatal: protocol error: bad pack header
Résolution : ?

12 Liens

12.1 Rsync avec git bash sous windows

12.2 Autres

12.3 Clients

12.4 Serveur web