{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# 2A.soft - Git depuis le notebook\n", "\n", "[Git](http://fr.wikipedia.org/wiki/Git) est un logiciel de suivi de source d\u00e9centralis\u00e9 qui permet de travailler \u00e0 plusieurs sur les m\u00eames fichiers. Aujourd'hui, on ne cr\u00e9e plus de logiciels sans ce type d'outil qui permet de garder l'historique des modifications apport\u00e9es \u00e0 un programme. [Git](http://fr.wikipedia.org/wiki/Git) a supplant\u00e9 tous les autres logiciels du m\u00eame type."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": ["import os\n", "root = os.path.abspath('.')"]}, {"cell_type": "markdown", "metadata": {}, "source": [" On v\u00e9rifie qu'il fonctionne :"]}, {"cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["usage: git [--version] [--help] [-C ] [-c name=value]\n", " [--exec-path[=]] [--html-path] [--man-path] [--info-path]\n", " [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]\n", " [--git-dir=] [--work-tree=] [--namespace=]\n", " []\n", "\n", "These are common Git commands used in various situations:\n", "\n", "start a working area (see also: git help tutorial)\n", " clone Clone a repository into a new directory\n", " init Create an empty Git repository or reinitialize an existing one\n", "\n", "work on the current change (see also: git help everyday)\n", " add Add file contents to the index\n", " mv Move or rename a file, a directory, or a symlink\n", " reset Reset current HEAD to the specified state\n", " rm Remove files from the working tree and from the index\n", "\n", "examine the history and state (see also: git help revisions)\n", " bisect Use binary search to find the commit that introduced a bug\n", " grep Print lines matching a pattern\n", " log Show commit logs\n", " show Show various types of objects\n", " status Show the working tree status\n", "\n", "grow, mark and tweak your common history\n", " branch List, create, or delete branches\n", " checkout Switch branches or restore working tree files\n", " commit Record changes to the repository\n", " diff Show changes between commits, commit and working tree, etc\n", " merge Join two or more development histories together\n", " rebase Reapply commits on top of another base tip\n", " tag Create, list, delete or verify a tag object signed with GPG\n", "\n", "collaborate (see also: git help workflows)\n", " fetch Download objects and refs from another repository\n", " pull Fetch from and integrate with another repository or a local branch\n", " push Update remote refs along with associated objects\n", "\n", "'git help -a' and 'git help -g' list available subcommands and some\n", "concept guides. See 'git help ' or 'git help '\n", "to read about a specific subcommand or concept.\n"]}], "source": ["!git"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Si cela ne fonctionne pas, cela signifie que soit [git](http://git-scm.com/) n'est pas install\u00e9, soit le notebook ne trouve pas le chemin o\u00f9 il est install\u00e9. Dans le premier cas, il suffit de l'installer puis de relancer le serveur de notebook pour prendre en compte les modifications. Dans le second cas, on peut s'en tirer avec une astuce du style :"]}, {"cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": ["!set PATH=%PATH%;chemin_git"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Dans son utilisation la plus simple, *git* permet de synchroniser un ensemble de fichiers entre plusieurs ordinateurs et utilisateurs :"]}, {"cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["c:\\Python363_x64\\lib\\site-packages\\sphinx\\util\\compat.py:40: RemovedInSphinx17Warning: sphinx.util.compat.Directive is deprecated and will be removed in Sphinx 1.7, please use docutils' instead.\n", " RemovedInSphinx17Warning)\n"]}, {"data": {"image/png": "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\n", "text/plain": [""]}, "execution_count": 6, "metadata": {}, "output_type": "execute_result"}], "source": ["from pyquickhelper.helpgen import NbImage\n", "NbImage(\"gits.png\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Par la suite, il faudra remplacer ``SERVEURGIT`` par le nom du serveur *git* (le serveur de l'\u00e9cole, github, bitbucket, ...)."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Cr\u00e9ation d'un r\u00e9pertoire\n", "\n", "On cr\u00e9e un projet afin de pouvoir y ajouter des fichiers et de suivre leur modifications. Cette op\u00e9ration ne devra \u00eatre r\u00e9alis\u00e9 qu'une seule fois. On cr\u00e9e ce projet dans le r\u00e9pertoire : ``c:\\temp\\premier_projet``. On cr\u00e9e ce r\u00e9pertoire puis on change le r\u00e9pertoire courant pour celui-ci :"]}, {"cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": ["import os\n", "folder = r\"premier_projet3\"\n", "if not os.path.exists(folder):\n", " os.mkdir(folder)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On initialise le r\u00e9pertoire :"]}, {"cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["Reinitialized existing Git repository in C:/xavierdupre/__home_/GitHub/ensae_teaching_cs/_doc/notebooks/2a/premier_projet3/.git/\n"]}], "source": ["!git init premier_projet3"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Premiers fichiers"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On ajoute un premier fichier ``README.md`` :"]}, {"cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["Overwriting premier_projet3/README.md\n"]}], "source": ["%%file premier_projet3/README.md\n", " \n", "Premier Projet\n", "==============\n", "\n", "* quelques listes"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On copie ce notebook \u00e9galement :"]}, {"cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": [" 1 fichier(s) copi\u201a(s).\n"]}], "source": ["!copy git_notebook.ipynb premier_projet3"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Git est beaucoup plus facile \u00e0 utiliser si on se place dans le rep\u00e9rtoire du projet :"]}, {"cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": ["import os\n", "os.chdir(\"premier_projet3\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Il faut pr\u00e9ciser \u00e0 *git* les fichiers qu'on souhaite ajouter o\u00f9 dont on souhaite enregister les modifications :"]}, {"cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": ["!git add README.md\n", "!git add git_notebook.ipynb"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On enregistre ces modifications avec un commentaire :"]}, {"cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["[master 81f5130] premier fichier et premier notebook\n", " 1 file changed, 729 insertions(+)\n", " create mode 100644 git_notebook.ipynb\n"]}], "source": ["!git commit -m \"premier fichier et premier notebook\""]}, {"cell_type": "markdown", "metadata": {}, "source": ["Ces modifications n'ont d'incidence que sur la copie en locale et n'ont pas encore \u00e9t\u00e9 propag\u00e9es jusqu'au serveur. On le fait en ex\u00e9cutant les deux instructions suivantes. La premi\u00e8re pr\u00e9cise dans quel r\u00e9pertoire du serveur *git* on souhaite ajouter les modifications. Il suffit en principe de ne le faire qu'une fois."]}, {"cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": ["!git remote add origin https://dupre@SERVEURGIT/dupre/premier_projet3.git"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Si vous vous \u00eates tromp\u00e9, vous pouvez revenir en arri\u00e8re avec :"]}, {"cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": ["!git remote remove origin"]}, {"cell_type": "markdown", "metadata": {}, "source": ["La seconde propage les modifications :"]}, {"cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["fatal: 'origin' does not appear to be a git repository\n", "fatal: Could not read from remote repository.\n", "\n", "Please make sure you have the correct access rights\n", "and the repository exists.\n"]}], "source": ["!git push -u origin master"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Si vous avez l'erreur pr\u00e9c\u00e9dente, c'est parce que le r\u00e9pertoire du projet n'a pas \u00e9t\u00e9 cr\u00e9\u00e9 sur le serveur git. Je vous conseille de le faire directement sur le serveur lui-m\u00eame (petit ic\u00f4ne + en haut \u00e0 droite sur un serveur [GitLab](https://about.gitlab.com/)) :"]}, {"cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [{"data": {"image/png": "iVBORw0KGgoAAAANSUhEUgAAAGUAAABWCAIAAABZ8M+bAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAXySURBVHhe7ZnfS1xHFMfzB0jRNib44osg1Def+uT6GCgULBQipFAWequBppHasiY2tRHU2m5WMAYJ6EO7q8FHKTSx5B8INav0yX2QNtW0T6UIddf9QcyZOXPnzr131r1nf3R/OF++LDPnzJ2Z83Hu6OKFK+9dNQ5uw4tmw4tmw4tmw4tmw4tmw4tmw4tmw4tmw4tmw4tmw4tmw4tmDa/h2w8frD5a1nt97vZ1z/hzZQ2vj6ZWAU10aixgvHLfePp34RRUePn0lidVqYdu3JxbXVp5tLySiM7dvTbkG0B0UV7FXAte3zz7l+E6Pf3n2feeVGW+dn0mrm5+cWbyXe8Ymsm87i98G674p+RxzXh9PQ0nS93/yv1PvWNoDsRLnilIPVhZX4zNVhdZK/OKTk18Nh+vHJl9ZxVTVe6yOr2Pbl7QtipHJs9UMVV61oZGPx6fGf9icsy576c/GZseH//yagXbpvFy/6mxPhMJy6eorvH5Yj9R3OTS4vLknbs379ybXUzg5hfnpz7wjg9qGi/V9lnzxstw9e8v67uouwS3V29ZvkeCuTV5vT+x7CnB49mJMt+M1uTlL8Hjsneu4eX/PlRrXlX/+3548qG6f7/nJ8v8Vqfh5XExLlXkVX0PfR5ZELe7z+tLC/Nl/2Yvzav41+/z+N27NC9j1YYXzYYXzYYXzYYXzYYXzYYXzYYXzYYXzYYXzYYXzYYXzYYXzYYXzYYXzYYXzYYXzRfeGbhiHNwXjhtDs1yi08BqCF5Aqour8ZHVn5eEhWpwZHXm5YGFamRk9eSlhYVqWGR6Xvv7+5Zl9fX1ie23ovr7+0dHR6FSUXMwaXjBFK1NSlVvb28qlRKVB5CGF5wsMdn5ENQrKg8gDa+BgQEx0/lQKBQSlQeQhpeY5jxJVB5AhheTqDyAKLwGo3uvXm2qlxuLuAL/l2Dhveig6JRWqX2KygOIzMtFrG68iKofr03L2nSWdu0DEiiMKDnWtI8DjHKdDDZdFPJMdgLG721ushhO4JkZxEbYs/izIBmEYdoBLonKA4jOC0vElRUmEMQKZEzWxCIKRVkoFy8GQ6xpP6kUJ2dWWs40/nVdTUwrAa1E5QFUDi+2C+8enVJ4mwchy2NsdBRjdsgRDJal2FlnWpA9m2jLhbFRZF3nES5/xC1ReQCVx8verxNhZSuSxUCWf4qRdkmOICILttNqeWrbXlZpwBOqeFAmpVyTaCQqD6AyeYlNWTLiB8HEonA5sQwfL06ZKpWXXahrIXVmOdgeqV3X9TiXP+KWqDyAyuaFXZCIOHWrBKBtHzYc7ts1H4FR+aB7Id3MMMIXc2VzG8Ntbe0XxVSD87/9tzbM+qBLb77RxnOOROUBVAEvgUBGYL8osWsmNsLusrwPF68Sfxc6D3oXkjPLIIyQq+jW7QpvHB0dpXN2cGA2Cf2NMEtdfutsXr//fO/HbdH2icKrJmK8lDoDquRTne2MSafodV1CRrLvkaj8+Dj9x+NYJBKJP0+n0yLkVvPx4ofafZg0OoPXZeV9xHezDRBFYo9fZF48YbRQ8W1gJvih4r82AK8aifPySvCS76O4yTq7DrcYlUQylz/cWoDW2m4ul8tktuMME4RBB3xIvKV5dcjzhYyw7/DCkwbAGBDUAeeV2M1msyfPGa7Y1iFrn5zkdxLQ1fAKhUJ8jaaW530UjDy8sN3d3Q0gQPFkNnvA38jEDgASzWSOvZfpdC5ZhFc4zH+NNLfOur8UXkwjIyOFXcYCMInXjvPKJvn5enKAvLCr4ZVKpXp6esRkzapAvC62t3V0dMR+2sNjtfDLX4XC7prkleUnKpLAix9BaniBABmcsmb+r0dpXm/391vWhz98NcqYgGJbLwuFfD6PR40drD9P8nD/M0yoxE4+r+fV7MpkMnh9w8GALnubslnowqmRKWjIOArvdfgEatCFNghTKOi2Ji8AAThAom9H4NOTwi6AgE/MgnjeGYxZEIxvTV61k+FFk+FFk+FFk+FFk+FFk+FFk+FFk+FFk+FFk+FF0fHxa3M5mzKU8ZvsAAAAAElFTkSuQmCC\n", "text/plain": [""]}, "execution_count": 17, "metadata": {}, "output_type": "execute_result"}], "source": ["from pyquickhelper.helpgen import NbImage\n", "NbImage(os.path.join(root, \"gitsp.png\"))"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On recommence, de pr\u00e9f\u00e9rence dans la fen\u00eatre de ligne de commande car sinon il faudra taper le mot de passe depuis la fen\u00eatre du serveur de notebook et ce n'est pas toujours \u00e9vident de ne pas se tromper."]}, {"cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["fatal: 'origin' does not appear to be a git repository\n", "fatal: Could not read from remote repository.\n", "\n", "Please make sure you have the correct access rights\n", "and the repository exists.\n"]}], "source": ["!git push -u origin master"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Les fichiers devrait \u00eatre sur le serveur. Pour enregistrer d'autres modifications faite dans le r\u00e9pertoire local, il suffit de recommencer \u00e0 partir de l'instruction ``git add``."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Cloner un r\u00e9pertoire\n", "\n", "Pour r\u00e9cup\u00e9rer les fichiers chez soi. Il faut cloner le r\u00e9pertoire, par exemple dans un autre r\u00e9pertoire local."]}, {"cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": ["import os\n", "folder = r\"projet3_copy\"\n", "if not os.path.exists(folder):\n", " os.mkdir(folder)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Puis taper la commande dans ce r\u00e9pertoire (de pr\u00e9f\u00e9rence depuis la ligne de commande s'il y a besoin de s'authentifier)."]}, {"cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["Cloning into 'premier_projet3'...\n", "fatal: unable to access 'https://SERVEURGIT/dupre/premier_projet3.git/': Couldn't resolve host 'SERVEURGIT'\n"]}], "source": ["!git clone https://SERVEURGIT/dupre/premier_projet3.git/"]}, {"cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [{"data": {"text/plain": ["[]"]}, "execution_count": 21, "metadata": {}, "output_type": "execute_result"}], "source": ["import os\n", "os.listdir(r\"projet3_copy\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Pour apporter les modifications sur le serveur *git*, il faut retourner aux instructions ``git add`` vues pr\u00e9c\u00e9demment."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Mettre \u00e0 jour un r\u00e9pertoire local\n", "\n", "Lorqu'on met \u00e0 jour le serveur distant *git* depuis une copie locale, il est pr\u00e9f\u00e9rable de mettre \u00e0 jour les autres copies locales avant de pouvoir les modifier. Il vaut mieux ex\u00e9cuter la commande depuis une ligne de commande s'il faut s'authentifier."]}, {"cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["fatal: unable to access 'https://SERVEURGIT/dupre/premier_projet3.git/': Couldn't resolve host 'SERVEURGIT'\n"]}], "source": ["!git pull https://SERVEURGIT/dupre/premier_projet3.git/"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Branches\n", "\n", "Le sc\u00e9nario classique pour travailler \u00e0 plusieurs. On suppose qu'il existe un *repository* remote appel\u00e9 *origin*. C'est le cas le plus classique quand on clone un r\u00e9pertoire de sources.\n", "\n", "* On met \u00e0 jour la branche principal : ``git pull`` (local = remote)\n", "* On cr\u00e9e une branche local : ``git checkout -b name/branch``\n", "* On fait sa modification.\n", "* On commit. ``git add`` + ``git commit -m \"...\"``\n", "* On met \u00e0 jour le remote en cr\u00e9ant aussi une branche l\u00e0-bas : ``git push -u origin name/branch``.\n", "* On envoie une [pull request](https://help.github.com/articles/about-pull-requests/).\n", "* Le d\u00e9tenteur de la branche principale accepte ou vous demande des modifications.\n", "* On d\u00e9truit la branche une fois que les modifications sont faites ``git branch -d name/branch``.\n", "\n", "Si la branche ``master`` est mise \u00e0 jour pendant que vous travaillez \u00e0 la v\u00f4tre, ``git pull origin master`` rappatriera les modifications."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Pour aller plus loin"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On peut faire beaucoup de choses avec *git* comme cr\u00e9er des branches, des tags, revenir \u00e0 en arri\u00e8re... La documentation sur git est assez pl\u00e9thorique sur internet [tutoriels sur git](http://sixrevisions.com/resources/git-tutorials-beginners/) et il existe des [client git](http://git-scm.com/download/gui/linux). [TortoiseGit](https://code.google.com/p/tortoisegit/) est l'un des plus simples. Ces outils permettent de se servir de *git* sans ligne de commande, juste avec la souris et l'exporateur de fichiers."]}, {"cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": []}, {"cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": []}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.3"}}, "nbformat": 4, "nbformat_minor": 2}