Révision partielle de formations EOLE

This commit is contained in:
2020-08-05 17:08:33 +02:00
parent a781e00a5a
commit 93be45617e
595 changed files with 19487 additions and 0 deletions

View File

@ -0,0 +1,10 @@
\begin{frame}
\frametitle{Exercices}
\framesubtitle{Configuration globale de git}
Les paramètres de l'application git peuvent être globaux ou propres à un dépôt.
L'ergonomie, l'identité, les alias sont souvent les mêmes pour tous les dépôts.
La première étape consiste généralement à renseigner ces paramètres.
Le premier exercice consiste donc à renseigner un minimum de ces variables globales.
\end{frame}

View File

@ -0,0 +1,38 @@
\begin{frame}
\frametitle{Mise en place}
\framesubtitle{Identité de l'utilisateur}
\begin{itemize}
\item \commande{git config --global user.name "<nom de l'utilisateur>"}
\item \commande{git config --global user.email "<courriel de l'utilisateur>"}
\end{itemize}
\begin{exampleblock}{En cas d'oubli}
\commande{git} émet un avertissement lors du premier commit si ces variables ne sont pas renseignées.
Il est possible de corriger cet oubli facilement si les commit n'ont pas encore été partagés.
\end{exampleblock}
\end{frame}
\begin{frame}
\frametitle{Mise en place}
\framesubtitle{Ergonomie}
\begin{itemize}
\item \commande{git config --global color.ui auto}
\item \commande{git config --global core.editor "<éditeur de texte à utiliser>"}
\item \commande{git config --global core.pager "<pager>"}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Mise en place}
\framesubtitle{Ergonomie (GNU/Linux)}
\begin{minted}{bash}
source ~/.git-prompt.sh
GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWSTASHSTATE=1
GIT_PS1_SHOWUNTRACKEDFILES=1
GIT_PS1_SHOWUPSTREAM="auto"
PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
\end{minted}
\begin{exampleblock}{git-prompt}
git-prompt.sh est un script définissant la fonction \_\_git\_ps1 permettant d'afficher des informations pertinentes sur l'état du dépôt git dans l'invite de commande.
\end{exampleblock}
\end{frame}

View File

@ -0,0 +1,14 @@
\begin{frame}
\frametitle{Exercices}
\framesubtitle{Initialiser un dépôt}
Un dépôt git peut être amorcé de différentes façons selon le contexte.
\begin{itemize}
\item le dépôt existe déjà en \emph{distant} :
\begin{itemize}
\item le dépôt distant est déjà au format git ;
\item le dépôt distant est géré par un autre scm ;
\end{itemize}
\item un répertoire local doit être converti en dépôt git ;
\end{itemize}
L'exercice propose la création d'un dépôt suivant ces différents contextes.
\end{frame}

View File

@ -0,0 +1,21 @@
\begin{frame}
\frametitle{Initialiser le dépôt}
\framesubtitle{Récupérer le dépôt git distant en ssh}
Le serveur de dépôt de test propose un dépôt par groupe.
\commande{git clone ssh://gogs@<adresse\_serveur>/formation/<groupe>}
\end{frame}
\begin{frame}
\frametitle{Initialiser le dépôt}
\framesubtitle{Récupérer le dépôt git distant en https}
L'accès au serveur est aussi permis en http(s)
\commande{git clone http://<adresse\_serveur>:3000/formation/<groupe>}
\end{frame}
\begin{frame}
\frametitle{Initialiser le dépôt}
\framesubtitle{Convertir le dossier local en dépôt git}
N'importe quelle répertoire peut être converti en dépôt git.
\commande{git init}
\end{frame}

View File

@ -0,0 +1,9 @@
\begin{frame}
\frametitle{Exercice}
\framesubtitle{Avoir des dépôts distants en référence}
Les dépôts distants sont un aspect important du fonctionnement d'un SCM décentralisé.
git permet d'associer plusieurs dépôts distants à un dépôt local et de renseigner à quelle branche de quel dépôt distant une branche locale doit se référer.
Le présent exercice aborde la mise en place de tels liens entre branches locales et branches distantes.
\end{frame}

View File

@ -0,0 +1,31 @@
\begin{frame}
\frametitle{Associer les dépôts distants}
\framesubtitle{Ajouter un dépôt distant}
\commande{git remote add <nom> <protocole>://[<utilisateur>@]<adresse>[:port]/<chemin>}
Exemples :
\begin{itemize}
\item \commande{git remote add formation ssh://gogs@localhost:3000/formation/exercices.git}
\item \commande{git remote add formation http://gogs@localhost:3000/formation/exercices.git}
\end{itemize}
\begin{exampleblock}{Vérification}
Les dépôts distants configurés peuvent être listés avec :
\begin{itemize}
\item \commande{git remote} pour la version sobre ou
\item \commande{git remote -v} pour plus de détails.
\end{itemize}
\end{exampleblock}
\end{frame}
\begin{frame}
\frametitle{Associer les dépôts distants}
\framesubtitle{Observer une branche distante}
Pour une branche distante existante :
\begin{itemize}
\item \commande{git branch --set-upstream-to=<nom\_dépôt\_distant>/<branche\_distante>}
\end{itemize}
Pour une branche distante inexistante :
\begin{itemize}
\item \commande{git push --set-upstream <nom\_dépôt\_distant> <branche\_locale>}
\end{itemize}
\end{frame}

View File

@ -0,0 +1,7 @@
\begin{frame}
\frametitle{Exercice}
\framesubtitle{Premier commit}
Le premier commit est toujours le plus facile. Pas de conflit à attendre, pas de stress…
Cet exercice permet de revoir le fonctionnement des \emph{arbres} de git avec l'ajout d'un simple fichier dans un dossier.
\end{frame}

View File

@ -0,0 +1,138 @@
\begin{frame}[fragile]
\frametitle{Premier pas}
\framesubtitle{Dépôt vide}
Au démarrage, est un dépôt vide :
\begin{minted}[fontsize=\tiny]{bash}
Sur la branche master
Validation initiale
rien à valider (créez/copiez des fichiers et utilisez "git add" pour les suivre)
\end{minted}
\end{frame}
\begin{frame}[fragile]
\frametitle{Premier pas}
\framesubtitle{Et pourtant…}
\begin{columns}
\begin{column}{0.5\textwidth}
L'initialisation consiste en la création du dossier .git :
\end{column}
\begin{column}{0.5\textwidth}
\begin{minted}[fontsize=\tiny]{bash}
.
└── .git
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
├── heads
└── tags
\end{minted}
\end{column}
\end{columns}
\end{frame}
\begin{frame}
\frametitle{Premier pas}
\framesubtitle{Création d'un dossier}
\commande{mkdir doc}
\end{frame}
\begin{frame}[fragile]
\frametitle{Premier pas}
\framesubtitle{Création d'un dossier}
\commande{git status}
\begin{minted}[fontsize=\tiny]{bash}
Sur la branche master
Validation initiale
rien à valider (créez/copiez des fichiers et utilisez "git add" pour les suivre)
\end{minted}
\begin{exampleblock}{}
git ne prend en considération que le contenu des fichiers.
\end{exampleblock}
\end{frame}
\begin{frame}
\frametitle{Premier pas}
\framesubtitle{Création d'un fichier}
\commande{touch doc/README}
\end{frame}
\begin{frame}[fragile]
\frametitle{Premier pas}
\framesubtitle{Création d'un fichier}
\commande{git status}
\begin{minted}[fontsize=\tiny]{bash}
Sur la branche master
Validation initiale
Fichiers non suivis:
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
doc/
aucune modification ajoutée à la validation mais des fichiers non suivis sont présents
(utilisez "git add" pour les suivre)
\end{minted}
\end{frame}
\begin{frame}
\frametitle{Premier pas}
\framesubtitle{Création d'un fichier}
\commande{git add .}
\skbinput[from=fig]{apps/git_commande_add}
\end{frame}
\begin{frame}[fragile]
\frametitle{Premier pas}
\framesubtitle{Création d'un fichier}
\commande{git status}
\begin{minted}[fontsize=\tiny]{bash}
Sur la branche master
Validation initiale
Modifications qui seront validées :
(utilisez "git rm --cached <fichier>..." pour désindexer)
nouveau fichier : doc/README
\end{minted}
\end{frame}
\begin{frame}
\frametitle{Premier pas}
\framesubtitle{Création d'un fichier}
\commande{git commit -m "Ajout du premier fichier."}
\skbinput[from=fig]{apps/git_commande_commit}
\end{frame}
\begin{frame}[fragile]
\frametitle{Premier pas}
\framesubtitle{Création d'un fichier}
\commande{git status}
\begin{minted}[fontsize=\tiny]{bash}
Sur la branche master
rien à valider, la copie de travail est propre
\end{minted}
\end{frame}

View File

@ -0,0 +1,8 @@
\begin{frame}
\frametitle{Exercice}
\framesubtitle{Gérer son répertoire de travail}
Le répertoire de travail est la vue du dépôt la plus facile à prendre en main dans un dépôt git.
Cet exercice a pour but de bien maîtriser les quatre états des fichiers dans un dépôt git : non-suivi, suivi et identique au contenu de l'index, suivi et différent et enfin, suivi, différent et selectionné pour archivage.
La difficulté majeure, à ce stade, est de toujours contrôler les passages d'état pour ne pas archiver un fichier indésirable par exemple.
\end{frame}

View File

@ -0,0 +1,115 @@
\begin{frame}
\frametitle{Gérer son répertoire de travail}
\framesubtitle{Créer un fichier}
\commande{echo "userA userApwd" > password}
\end{frame}
\begin{frame}
\frametitle{Gérer son répertoire de travail}
\framesubtitle{Modifier un fichier}
Ajouter du texte au fichier doc/README
\end{frame}
\begin{frame}[fragile]
\frametitle{Gérer son répertoire de travail}
\framesubtitle{Admirer la complexité de la situation}
\commande{git status}
\begin{minted}[fontsize=\tiny]{console}
Sur la branche master
Modifications qui seront validées :
(utilisez "git reset HEAD <fichier>..." pour désindexer)
modifié : doc/README
Fichiers non suivis:
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
password
\end{minted}
\end{frame}
\begin{frame}[fragile]
\frametitle{Gérer son répertoire de travail}
\framesubtitle{À la croisée des chemins}
Associer les commandes suivantes :
\begin{columns}
\begin{column}{.3\textwidth}
\tiny{\commande{git add .}}
\tiny{\commande{git commit -m "Tout de go"}}
\end{column}
\begin{column}{.3\textwidth}
\tiny{\commande{git commit -am "Implicite"}}
\end{column}
\begin{column}{.3\textwidth}
\tiny{\commande{git add doc/README}}
\tiny{\commande{git commit -m "Explicite"}}
\end{column}
\end{columns}
aux résultats suivants :
\begin{columns}
\begin{column}{.3\textwidth}
\begin{minted}[fontsize=\tiny,breaklines,frame=single]{console}
Sur la branche master
Fichiers non suivis:
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
password
aucune modification ajoutée à la validation mais des fichiers non suivis sont présents (utilisez "git add" pour les suivre)
\end{minted}
\end{column}
\begin{column}{.3\textwidth}
\begin{minted}[fontsize=\tiny,breaklines,frame=single]{console}
Sur la branche master
rien à valider, la copie de travail est propre
\end{minted}
\end{column}
\begin{column}{.3\textwidth}
\begin{minted}[fontsize=\tiny,breaklines,frame=single]{console}
Sur la branche master
Fichiers non suivis:
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
password
aucune modification ajoutée à la validation mais des fichiers non suivis sont présents (utilisez "git add" pour les suivre)
\end{minted}
\end{column}
\end{columns}
\end{frame}
\begin{frame}
\frametitle{Gérer son répertoire de travail}
\framesubtitle{Parer les erreurs prévisibles}
\commande{echo "password" > .gitignore}
\commande{git add .gitignore}
\commande{git commit -m "Filtre de fichier à ne pas suivre"}
\end{frame}
\begin{frame}[fragile]
\frametitle{Gérer son répertoire de travail}
\framesubtitle{Laisser sur le côté de la route}
\commande{git status}
\begin{minted}[fontsize=\tiny]{console}
Sur la branche master
rien à valider, la copie de travail est propre
\end{minted}
\end{frame}
\begin{frame}
\frametitle{Gérer son répertoire de travail}
\framesubtitle{Et s'il est trop tard ?}
\commande{git reset HEAD\~{}1}
\end{frame}
\begin{frame}
\frametitle{Gérer son répertoire de travail}
\framesubtitle{Recueil de .gitignore}
Des .gitignore adaptés à différents contextes sont faciles à obtenir sur l'Internet.
\url{https://github.com/github/gitignore}
\end{frame}

View File

@ -0,0 +1,8 @@
\begin{frame}
\frametitle{Exercice}
\framesubtitle{Utiliser les branches}
Les branches sont faciles à créer et détruire dans un dépôt git.
Cela en fait un outil de choix pour l'organisation du développement.
L'exercice suivant aborde les manipulations de base avec les branches.
\end{frame}

View File

@ -0,0 +1,219 @@
\begin{frame}
\frametitle{Utiliser les branches}
\framesubtitle{Créer une branche}
On créé une branche qui contiendra le fichier password.
\commande{git checkout -b branche\_indiscrete}
équivalent de la succession de commandes :
\begin{enumerate}
\item \commande{git branch branche\_indiscrete}
\item \commande{git checkout branche\_indiscrete}
\end{enumerate}
\begin{tikzpicture}
\gitDAG[grow right sep = 1em]{
A -- B};
\gitbranch{master}{above=of B}{B}
\gitHEAD{above=of master}{master}
\end{tikzpicture}
\begin{tikzpicture}
\gitDAG[grow right sep = 1em]{
A -- B};
\gitbranch{master}{above=of B}{B}
\gitHEAD{above=of master}{master}
\gitbranch[brindis]{brancheindiscrete}{below=of B}{B}
\end{tikzpicture}
\begin{tikzpicture}
\gitDAG[grow right sep = 1em]{
A -- B};
\gitbranch{master}{above=of B}{B}
\gitbranch[brindis]{brancheindiscrete}{below=of B}{B}
\gitHEAD{below=of brindis}{brindis}
\end{tikzpicture}
\end{frame}
\begin{frame}
\frametitle{Utiliser les branches}
\frametitle{Aparté}
\commande{git add password}
\commande{git commit -m "le fichier indésirable"}
\end{frame}
\begin{frame}
\frametitle{Utiliser les branches}
\frametitle{Aparté}
\commande{git log master..branche\_indiscrete}
\commande{git log master..}
\commande{git reflog}
\end{frame}
\begin{frame}
\frametitle{Utiliser les branches}
\framesubtitle{Merge}
\commande{git checkout master}
\commande{git branch merge/automatique}
\commande{git branch merge/conflit}
\commande{git branch merge/rebase}
% \begin{tikzpicture}
% \gitDAG[grow down sep = 1em]{
% A -- B};
% \gitbranch{master}{left=of B}{B}
% \gitHEAD{left=of master}{master}
% \gitbranch[auto]{merge/automatique}{right=of master}{B}
% \gitbranch[conflit]{merge/conflit}{right=of auto}{B}
% \gitbranch[rebase]{merge/rebase}{right=of conflit}{B}
% \end{tikzpicture}
\end{frame}
\begin{frame}
\frametitle{Utiliser les branches}
\framesubtitle{Merge}
\commande{git checkout merge/automatique}
\commande{cp doc/README\{,.md\}}
\commande{git add doc/}
\commande{git commit -m "Copie du fichier"}
% \begin{tikzpicture}
% \gitDAG[grow down sep = 1em]{
% A -- B --{C}};
% \gitbranch{master}{right=of B}{B}
% \gitHEAD{left=of auto}{auto}
% \gitbranch[auto]{merge/automatique}{left=of C}{C}
% \gitbranch[conflit]{merge/conflit}{right=of master}{B}
% \gitbranch[rebase]{merge/rebase}{right=of conflit}{B}
% \end{tikzpicture}
\end{frame}
\begin{frame}
\frametitle{Utiliser les branches}
\framesubtitle{Merge}
\commande{git checkout merge/conflit}
Édition du fichier doc/README
\commande{git commit -am "Des ennuis en perspective"}
% \begin{tikzpicture}
% \gitDAG[grow down sep = 1em]{
% A -- B --{C, D}};
% \gitbranch{master}{right=of B}{B}
% \gitHEAD{left=of conflit}{conflit}
% \gitbranch[auto]{merge/automatique}{right=of C}{C}
% \gitbranch[conflit]{merge/conflit}{left=of D}{D}
% \gitbranch[rebase]{merge/rebase}{right=of master}{B}
% \end{tikzpicture}
\end{frame}
\begin{frame}
\frametitle{Utiliser les branches}
\framesubtitle{Merge}
\commande{git checkout merge/rebase}
Édition du fichier doc/README
\commande{git commit -am "Des ennuis en perspective"}
% \begin{tikzpicture}
% \gitDAG[grow right sep = 1em]{
% A -- B --{C, D, E}};
% \gitbranch{master}{above=of B}{B}
% \gitHEAD{above=of rebase}{rebase}
% \gitbranch[auto]{merge/automatique}{above=of C}{C}
% \gitbranch[conflit]{merge/conflit}{above=of D}{D}
% \gitbranch[rebase]{merge/rebase}{above=of E}{E}
% \end{tikzpicture}
\end{frame}
\begin{frame}
\frametitle{Utiliser les branches}
\framesubtitle{Merge}
\commande{git checkout master}
Édition du fichier doc/README pour ajouter des alias
\commande{git commit -am "Des ennuis en perspective"}
Pour chaque branche merge/*, tenter la commande :
\commande{git merge merge/<nom>}
\end{frame}
\begin{frame}
\frametitle{Utiliser les branches}
\framesubtitle{Rebase}
\commande{git checkout merge/rebase}
\commande{git rebase master}
% \begin{tikzpicture}
% \gitDAG[grow down sep = 1em]{
% A -- B --{C, D, E'}};
% \gitbranch{master}{right=of B}{B}
% \gitHEAD{left=of rebase}{rebase}
% \gitbranch[auto]{merge/automatique}{right=of C}{C}
% \gitbranch[conflit]{merge/conflit}{right=of D}{D}
% \gitbranch[rebase]{merge/rebase}{left=of E'}{E'}
% \end{tikzpicture}
\end{frame}
% \begin{tikzpicture}
% % Commit DAG
% \gitDAG[grow right sep = 2em]{
% A -- B -- {
% C,
% D -- E,
% }
% };
% % Tag reference
% \gittag
% [v0p1] % node name
% {v0.1} % node text
% {above=of A} % node placement
% {A} % target
% % Remote branch
% \gitremotebranch
% [origmaster] % node name
% {origin/master} % node text
% {above=of C} % node placement
% {C} % target
% % Branch
% \gitbranch
% {master} % node name and text
% {above=of E} % node placement
% {E} % target
% % HEAD reference
% \gitHEAD
% {above=of master} % node placement
% {master} % target
% \end{tikzpicture}
% \begin{tikzpicture}
% \gitDAG[grow right sep = 2em]{
% A -- B -- {
% C -- D' -- E',
% {[nodes=unreachable] D -- E },
% }
% };
% % Tag reference
% \gittag
% [v0p1] % node name
% {v0.1} % node text
% {above=of A} % node placement
% {A} % target
% % Remote branch
% \gitremotebranch
% [origmaster] % node name
% {origin/master} % node text
% {above=of C} % node placement
% {C} % target
% % Branch
% \gitbranch
% {master} % node name and text
% {above=of E'} % node placement
% {E'} % target
% % HEAD reference
% \gitHEAD
% {above=of master} % node placement
% {master} % target
% \SAandWT
% \end{tikzpicture}

View File

@ -0,0 +1,11 @@
\begin{frame}
\frametitle{Exercice}
\framesubtitle{Inspection générale}
Un historique de code n'a d'intérêt que si le besoin de connaître les actions
qui ont mené à un état se fait sentir.
git met à disposition divers outils pour inspecter l'historique.
Cet exercice se propose de présenter certains de ces outils.
Cet exercice s'appuie sur le contenu du dépôt git \emph{exercices} fourni.
\end{frame}

View File

@ -0,0 +1,132 @@
\begin{frame}
\frametitle{Inspection}
\framesubtitle{log}
Comparer les branches du dépôt \emph{exercices} en explorant les différentes options de git log (--graph, --all, --decorate, .., ...)
\commande{git log}
% contenu (pas trop long) de la diapositive
\end{frame}
\begin{frame}
\frametitle{Inspection}
\framesubtitle{log}
\begin{tikzpicture}
\begin{pgflowlevelscope}{\pgftransformscale{0.5}}
\gitDAG[grow right sep=1em]{
fcacc8a -- a3a980c -- {6d7f839 -- {d221665 -- 841f693 -- f5965df -- a12f94b -- 5464ee7, fe0c2b7 -- 6212e29 -- 0f13577 -- a60f3ed, f81ca5c, 7e54de0},
30a5821, b13bcf2, 902ae87}
};
\gitbranch
{master}
{above=of 6d7f839}
{6d7f839}
\gitbranch
{brancheindiscrete}
{right=of 902ae87}
{902ae87}
\gitbranch
{merge/conflit}
{right=of 30a5821}
{30a5821}
\gitbranch
{merge/automatique}
{right=of b13bcf2}
{b13bcf2}
\gitbranch
{merge/rebase}
{right=of 7e54de0}
{7e54de0}
\gitbranch
{branche/perdue}
{right=of f81ca5c}
{f81ca5c}
\gitbranch
{branche/minee}
{above=of 5464ee7}
{5464ee7}
\gitbranch
{histoire/confuse}
{right=of a60f3ed}
{a60f3ed}
\end{pgflowlevelscope}
\end{tikzpicture}
\end{frame}
\begin{frame}
\frametitle{Inspection}
\framesubtitle{bisect}
\begin{minipage}{\textwidth}
\begin{tikzpicture}
%\begin{pgflowlevelscope}{\pgftransformscale{0.5}}
\begin{pgflowlevel}{\pgftransformscale{0.6}}
\gitDAG[grow right sep=1em]{
fcacc8a -- a3a980c -- {6d7f839 -- {d221665 -- 841f693 -- f5965df -- a12f94b -- 5464ee7}}
};
\gitbranch
{master}
{above=of 6d7f839}
{6d7f839}
\gitbranch
{branche/minee}
{above=of 5464ee7}
{5464ee7}
%\end{pgflowlevelscope}
\end{pgflowlevel}
\end{tikzpicture}
\end{minipage}
La branche minee schématise une situation dans laquelle un dysfonctionnement a été introduit mais pas détecté
aussitôt.
Un script \emph{test.sh} a été ajouté pour simuler le test du code.
Il retourne \emph{0} lorsque le code est bon, \emph{1} lorsque le code est mauvais.
L'exercice consiste donc à utiliser la commande \commande{git bisect} pour repérer le commit ayant introduit l'erreur, c'est-à-dire à partir duquel le script retourne \emph{1}.
\end{frame}
\begin{frame}
\frametitle{Inspection}
\framesubtitle{bisect}
Conditions de départ :
\begin{itemize}
\item dernier \emph{commit} de la branche \emph{branche/minee}
\item dernier état du code fonctionnel : dernier \emph{commit} de la branche \emph{master}.
\end{itemize}
\begin{enumerate}[<+->]
\item \commande{git checkout branche/minee}
\item \commande{git bisect start} \# démarrage de la session de recherche
\item \commande{git bisect bad} \# déclaration de l'état du dernier \emph{commit}
\item \commande{git bisect good \$(git log --oneline -1 --format=\%h master)} \# déclaration du dernier état fonctionnel connu
\end{enumerate}
% contenu (pas trop long) de la diapositive
\end{frame}
\begin{frame}
\frametitle{Inspection}
\framesubtitle{bisect}
À chaque déplacement contrôlé par \commande{git bisect}, exécuter \emph{test.sh} et indiquer si l'état est fonctionnel :
\commande{./test.sh; [[ \$? -eq 0 ]] \&\& git bisect good || git bisect bad}
\end{frame}
\begin{frame}
\frametitle{Inspection}
\framesubtitle{bisect}
\commande{a12f94b62f617417f4b1f8c5317bc2f033c92f5a is the first bad commit}
Terminer la session de recherche :
\commande{git bisect reset}
\end{frame}
\begin{frame}
\frametitle{Inspection}
\framesubtitle{blame}
La conclusion précédente, vu la simplicité du code en cause, aurait pu être tirée grâce à \commande{git blame} et \commande{git log}.
% contenu (pas trop long) de la diapositive
\end{frame}
\begin{frame}
\frametitle{Inspection}
\framesubtitle{blame}
\begin{itemize}
\item \commande{git blame test.sh}
\item \commande{git log -S"exit 1" test.sh}
\end{itemize}
\end{frame}

View File

@ -0,0 +1,8 @@
\begin{frame}
\frametitle{Exercice}
\framesubtitle{Travail collaboratif}
En fait de travail collaboratif, chacun peut facilement personnifier l'enfer pour ses collègues.
L'exercice suivant propose de nettoyer son dépôt personnel avant de le rendre public.
% contenu (pas trop long) de la diapositive
\end{frame}

View File

@ -0,0 +1,156 @@
\begin{frame}
\frametitle{Travail collaboratif}
\framesubtitle{Nettoyage}
\begin{minipage}{\textwidth}
\begin{tikzpicture}
%\begin{pgflowlevelscope}{\pgftransformscale{0.5}}
\begin{pgflowlevel}{\pgftransformscale{0.6}}
\gitDAG[grow right sep=1em]{
fcacc8a -- a3a980c -- {6d7f839 -- {fe0c2b7 -- 6212e29 -- 0f13577 -- a60f3ed}}
};
\gitbranch
{master}
{above=of 6d7f839}
{6d7f839}
\gitbranch
{histoire/confuse}
{above=of a60f3ed}
{a60f3ed}
%\end{pgflowlevelscope}
\end{pgflowlevel}
\end{tikzpicture}
\end{minipage}
Le scénario proposé pour le nettoyage s'appuie sur la branche \emph{histoire/confuse}.
Les \emph{commit} n'y sont pas cohérents : mélange de corrections syntaxiques, orthographiques et grammaticales.
Le but est de redonner de la lisibilité à l'historique du dépôt en le réécrivant à l'aide de \commande{git rebase -i} et \commande{git add -i}.
\end{frame}
\begin{frame}
\frametitle{Travail collaboratif}
\framesubtitle{Nettoyage}
\begin{enumerate}[<+->]
\item \commande{git checkout histoire/confuse}
\item \commande{git show master..} \# aperçu des modifications à réorganiser
\item \commande{git rebase -i \$(git merge-base --fork-point master)} \# rebase de tous les commits depuis la divergence avec la branche \emph{master}
\end{enumerate}
\end{frame}
\begin{frame}[fragile]
\frametitle{Travail collaboratif}
\framesubtitle{Nettoyage}
À l'origine :
\begin{minted}[fontsize=\tiny]{console}
pick fe0c2b7 Commit un peu rapide.
pick 6212e29 Premier commit de correction
pick 0f13577 Deuxième commit de correction
pick a60f3ed Troisième et dernier (on espère) commit de correction
\end{minted}
Ce qu'on veut faire :
\begin{itemize}
\item un \emph{commit} pour les espaces superflues (0f13577 et 6212e29)
\item un \emph{commit} pour l'orthographe et la grammaire (0f13577, a60f3ed et 6212e29)
\item un \emph{commit} pour le contresens
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Travail collaboratif}
\framesubtitle{Nettoyage}
\begin{enumerate}[<+->]
\item s'arrêter sur le \emph{commit} 6212e29 et répartir les modifications sur trois \emph{commit}
\item s'arrèter sur le \emph{commit} 0f13577 et répartir les modifications sur deux \emph{commit}
\item reformuler le message du \emph{commit} a60f3ed
\end{enumerate}
\begin{minted}[fontsize=\tiny]{console}
pick fe0c2b7 Commit un peu rapide.
e 6212e29 Premier commit de correction
e 0f13577 Deuxième commit de correction
r a60f3ed Troisième et dernier (on espère) commit de correction
\end{minted}
\end{frame}
\begin{frame}[fragile]
\frametitle{Travail collaboratif}
\framesubtitle{Nettoyage}
Pour chaque \emph{commit} édité :
\begin{enumerate}[<+->]
\item \commande{git reset HEAD\~{}1}
\item \commande{git add -i}
\item \commande{patch} et sélection du fichier à éditer
\item validation, refus ou édition du fragment de patch
\item sortie du mode patch
\item \commande{git add doc/README} suivi de \commande{git commit}
\item si il n'y a plus de modifications, \commande{git rebase --continue}, sinon, retour à l'étape 2
\end{enumerate}
\end{frame}
\begin{frame}[fragile]
\frametitle{Travail collaboratif}
\framesubtitle{Nettoyage}
\begin{minted}[fontsize=\tiny]{console}
f500056 Corrections orthographiques et grammaticales
a11256a Suppression des espaces superflues
1a03003 Corrections orthographiques et grammaticales
f48a802 Corrections orthographiques et grammaticales
9ed1adb Suppression des espaces superflues
7236369 Correction du contresens
fe0c2b7 Commit un peu rapide.
\end{minted}
\end{frame}
\begin{frame}[fragile]
\frametitle{Travail collaboratif}
\framesubtitle{Nettoyage}
Prêt pour la seconde passe.
\begin{minted}[fontsize=\tiny]{console}
pick fe0c2b7 Commit un peu rapide.
pick 7236369 Correction du contresens
pick 9ed1adb Suppression des espaces superflues
s a11256a Suppression des espaces superflues
pick f48a802 Corrections orthographiques et grammaticales
s 1a03003 Corrections orthographiques et grammaticales
s f500056 Corrections orthographiques et grammaticales
\end{minted}
\end{frame}
\begin{frame}[fragile]
\frametitle{Travail collaboratif}
\framesubtitle{Nettoyage}
Prêt pour la seconde passe.
\begin{minted}[fontsize=\tiny]{console}
f7caf4b Corrections orthographiques et grammaticales
cdcf39e Suppression des espaces superflues
7236369 Correction du contresens
fe0c2b7 Commit un peu rapide.
\end{minted}
\end{frame}
\begin{frame}
\frametitle{Travail collaboratif}
\framesubtitle{Nettoyage}
Évidemment, dans la situation décrite, peu de modifications mais imbriquées, un résultat équivalent mais plus rapidement obtenu avec :
\begin{enumerate}[<+->]
\item \commande{git reset \$(git merge-base --fork-point master)}
\item \commande{git add -i}
\end{enumerate}
\end{frame}
\begin{frame}
\frametitle{Travail collaboratif}
\framesubtitle{Nettoyage}
\begin{minipage}{\textwidth}
\begin{tikzpicture}
%\begin{pgflowlevelscope}{\pgftransformscale{0.5}}
\begin{pgflowlevel}{\pgftransformscale{0.6}}
\gitDAG[grow right sep=1em]{
fcacc8a -- a3a980c -- {902ae87}
};
\gitbranch
{brancheindiscrete}
{above=of 902ae87}
{902ae87}
%\end{pgflowlevelscope}
\end{pgflowlevel}
\end{tikzpicture}
\end{minipage}
Il ne reste plus qu'à purger les \emph{commit} de tous les fichiers embarrassants, ajoutés par inadvertance.
\begin{enumerate}[<+->]
\item \commande{git checkout branche\_indiscrete}
\item \commande{git filter-branch --tree-filter "git rm password" master..}
\end{enumerate}
% contenu (pas trop long) de la diapositive
\end{frame}

View File

@ -0,0 +1,8 @@
\begin{frame}
\frametitle{Travail collaboratif}
\framesubtitle{Partager}
Reprendre les exercices en incluant les commandes push, pull et fetch.
Côté serveur, tester les hooks.
% contenu (pas trop long) de la diapositive
\end{frame}

View File

@ -0,0 +1,4 @@
\begin{frame}
\frametitle{}
% contenu (pas trop long) de la diapositive
\end{frame}

View File

@ -0,0 +1,9 @@
\begin{frame}
\frametitle{Exercice}
\framesubtitle{Intégration dans les processus}
git est intégré dans divers processus, notamment les processus de packaging.
Cet exercice donne un aperçu d'une telle intégration dans le cas du packaging debian.
% contenu (pas trop long) de la diapositive
\end{frame}

View File

@ -0,0 +1,35 @@
\begin{frame}
\frametitle{Packaging debian}
\framesubtitle{buildpackage}
buildpackage regroupe les outils simplifiant le packaging debian basé sur des sources maintenues en dépôts git.
\commande{apt-get install git-buildpackage}
% contenu (pas trop long) de la diapositive
\end{frame}
\begin{frame}
\frametitle{Packaging debian}
\framesubtitle{patchs}
gbp-pq est la commande permettant de faire correspondre les commit d'une branche aux patchs d'un paquet.
Depuis la branche de packaging :
\commande{gbp-pq import}
Après modification du code et organisation en commit :
\commande{gbp-pq export}
% contenu (pas trop long) de la diapositive
\end{frame}
\begin{frame}
\frametitle{Packaging debian}
\framesubtitle{changelog}
git dch permet d'automatiser l'écriture du changelog en se basant sur les commit.
\commande{git dch}
% contenu (pas trop long) de la diapositive
\end{frame}
\begin{frame}
\frametitle{Packaging debian}
\framesubtitle{description du paquet}
Finalement, git buildpackage produit les fichiers nécessaires à la construction du paquet : .dsc, archive des sources, etc.
\commande{apt-get install git-buildpackage}
% contenu (pas trop long) de la diapositive
\end{frame}