CINXE.COM

Git - Migration vers Git

<!DOCTYPE html> <html lang="fr"> <head> <meta charset='utf-8'> <meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible'> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Git - Migration vers Git</title> <link href="/favicon.ico" rel='shortcut icon' type='image/x-icon'> <link rel="stylesheet" href="/application.min.css"> <script src="/js/modernizr.js"></script> <script src="/js/modernize.js"></script> </head> <body id="documentation"> <div class="inner"> <header> <a href="/"><img src="/images/logo@2x.png" width="110" height="46" alt="Git" /></a> <span id="tagline"></span> <script type="text/javascript"> const taglines = [ "fast-version-control", "everything-is-local", "distributed-even-if-your-workflow-isnt", "local-branching-on-the-cheap", "distributed-is-the-new-centralized" ]; var tagline = taglines[Math.floor(Math.random() * taglines.length)]; document.getElementById('tagline').innerHTML = '--' + tagline; </script> <form id="search" action="/search/results"> <input id="search-text" name="search" placeholder="Type / to search entire site…" autocomplete="off" type="text" /> </form> <div id="search-results"></div> </header> </div> <div class="inner"> <div id="content-wrapper"> <div tabindex="1" class="sidebar-btn"></div> <aside class="sidebar" id="sidebar"> <nav> <ul> <li> <a href="/about">About</a> <ul> </ul> </li> <li> <a href="/doc" class="active">Documentation</a> <ul class="expanded"> <li> <a href="/docs">Reference</a> </li> <li> <a href="/book" class="active">Book</a> </li> <li> <a href="/videos">Videos</a> </li> <li> <a href="/doc/ext">External Links</a> </li> </ul> </li> <li> <a href="/downloads">Downloads</a> <ul > <li> <a href="/downloads/guis">GUI Clients</a> </li> <li> <a href="/downloads/logos">Logos</a> </li> </ul> </li> <li> <a href="/community">Community</a> </li> </ul> <hr class="sidebar"> <p> This book is available in <a href="/book/en/v2/Git-and-Other-Systems-Migrating-to-Git">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Git-v%c9%99-Dig%c9%99r-Sisteml%c9%99r-Git%e2%80%99%c9%99-Miqrasiya">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg/v2/%d0%9f%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-A:-Git-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d0%b8-%d1%81%d1%80%d0%b5%d0%b4%d0%b8-Git-%d0%b2%d1%8a%d0%b2-Visual-Studio">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-und-andere-VCS-Systeme-Migration-zu-Git">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Git-y-Otros-Sistemas-Migraci%c3%b3n-a-Git">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Git-et-les-autres-syst%c3%a8mes-Migration-vers-Git">Français</a>,</td></tr> <tr><td><a href="/book/gr">Ελληνικά</a>,</td></tr> <tr><td><a href="/book/ja/v2/Git%e3%81%a8%e3%81%9d%e3%81%ae%e4%bb%96%e3%81%ae%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ae%e9%80%a3%e6%90%ba-Git-%e3%81%b8%e7%a7%bb%e8%a1%8c%e3%81%99%e3%82%8b">日本語</a>,</td></tr> <tr><td><a href="/book/ko/v2/Git%ea%b3%bc-%ec%97%ac%ed%83%80-%eb%b2%84%ec%a0%84-%ea%b4%80%eb%a6%ac-%ec%8b%9c%ec%8a%a4%ed%85%9c-Git%ec%9c%bc%eb%a1%9c-%ec%98%ae%ea%b8%b0%ea%b8%b0">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Git-en-andere-systemen-Migreren-naar-Git">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/Git-%d0%b8-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%b5-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d1%8b-%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%be%d0%bb%d1%8f-%d0%b2%d0%b5%d1%80%d1%81%d0%b8%d0%b9-%d0%9f%d0%b5%d1%80%d0%b5%d1%85%d0%be%d0%b4-%d0%bd%d0%b0-Git">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Git-in-ostali-sistemi-Migracija-na-Git">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Ang-Git-at-iba-pang-mga-Sistema-Paglilipat-sa-Git">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/Git-and-Other-Systems-%d0%9c%d1%96%d0%b3%d1%80%d0%b0%d1%86%d1%96%d1%8f-%d0%bd%d0%b0-Git">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/Git-%e4%b8%8e%e5%85%b6%e4%bb%96%e7%b3%bb%e7%bb%9f-%e8%bf%81%e7%a7%bb%e5%88%b0-Git">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/Git-a-ostatn%c3%ad-syst%c3%a9my-Migrating-to-Git">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/Git-%d0%b8-%d0%b4%d1%80%d1%83%d0%b3%d0%b8-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d0%b8-%d0%9c%d0%b8%d0%b3%d1%80%d0%b8%d1%80%d0%b0%d1%9a%d0%b5-%d0%ba%d0%be%d0%bd-Git">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Git-i-inne-systemy-Migracja-do-Gita">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%93%d0%b8%d1%82-%d0%b8-%d0%be%d1%81%d1%82%d0%b0%d0%bb%d0%b8-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d0%b8-%d0%9c%d0%b8%d0%b3%d1%80%d0%b8%d1%80%d0%b0%d1%9a%d0%b5-%d0%bd%d0%b0-%d0%93%d0%b8%d1%82">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Git-and-Other-Systems-Migrating-to-Git">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/Git-and-Other-Systems-Migrating-to-Git">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Git-and-Other-Systems-Migrating-to-Git">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/Git-and-Other-Systems-Migrating-to-Git" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Git-and-Other-Systems-Migrating-to-Git">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Git-and-Other-Systems-Migrating-to-Git">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Git-and-Other-Systems-Migrating-to-Git">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Git-and-Other-Systems-Migrating-to-Git">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/O-Git-e-Outros-Sistemas-Migrar-para-o-Git">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Git-and-Other-Systems-Migrating-to-Git">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Git-ve-Di%c4%9fer-Sistemler-Git%e2%80%99e-Ge%c3%a7i%c5%9f">Türkçe</a>.</td></tr> </table> </p> <hr class="sidebar"/> <p> The source of this book is <a href="https://github.com/progit/progit2-fr">hosted on GitHub.</a></br> Patches, suggestions and comments are welcome. </p> </nav> </aside> <div id="content"> <div id="book-chapters"> <a class="dropdown-trigger" id="book-chapters-trigger" data-panel-id="chapters-dropdown" href="#">Chapters ▾</a> <div class='dropdown-panel' id='chapters-dropdown'> <div class='three-column'> <div class="column-left"> <ol class='book-toc'> <li class='chapter'> <h2>1. <a href="/book/fr/v2/D%c3%a9marrage-rapide-%c3%80-propos-de-la-gestion-de-version">Démarrage rapide</a></h2> <ol> <li> 1.1 <a href="/book/fr/v2/D%c3%a9marrage-rapide-%c3%80-propos-de-la-gestion-de-version">À propos de la gestion de version</a> </li> <li> 1.2 <a href="/book/fr/v2/D%c3%a9marrage-rapide-Une-rapide-histoire-de-Git">Une rapide histoire de Git</a> </li> <li> 1.3 <a href="/book/fr/v2/D%c3%a9marrage-rapide-Rudiments-de-Git">Rudiments de Git</a> </li> <li> 1.4 <a href="/book/fr/v2/D%c3%a9marrage-rapide-La-ligne-de-commande">La ligne de commande</a> </li> <li> 1.5 <a href="/book/fr/v2/D%c3%a9marrage-rapide-Installation-de-Git">Installation de Git</a> </li> <li> 1.6 <a href="/book/fr/v2/D%c3%a9marrage-rapide-Param%c3%a9trage-%c3%a0-la-premi%c3%a8re-utilisation-de-Git">Paramétrage à la première utilisation de Git</a> </li> <li> 1.7 <a href="/book/fr/v2/D%c3%a9marrage-rapide-Obtenir-de-l%e2%80%99aide">Obtenir de l’aide</a> </li> <li> 1.8 <a href="/book/fr/v2/D%c3%a9marrage-rapide-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/fr/v2/Les-bases-de-Git-D%c3%a9marrer-un-d%c3%a9p%c3%b4t-Git">Les bases de Git</a></h2> <ol> <li> 2.1 <a href="/book/fr/v2/Les-bases-de-Git-D%c3%a9marrer-un-d%c3%a9p%c3%b4t-Git">Démarrer un dépôt Git</a> </li> <li> 2.2 <a href="/book/fr/v2/Les-bases-de-Git-Enregistrer-des-modifications-dans-le-d%c3%a9p%c3%b4t">Enregistrer des modifications dans le dépôt</a> </li> <li> 2.3 <a href="/book/fr/v2/Les-bases-de-Git-Visualiser-l%e2%80%99historique-des-validations">Visualiser l’historique des validations</a> </li> <li> 2.4 <a href="/book/fr/v2/Les-bases-de-Git-Annuler-des-actions">Annuler des actions</a> </li> <li> 2.5 <a href="/book/fr/v2/Les-bases-de-Git-Travailler-avec-des-d%c3%a9p%c3%b4ts-distants">Travailler avec des dépôts distants</a> </li> <li> 2.6 <a href="/book/fr/v2/Les-bases-de-Git-%c3%89tiquetage">Étiquetage</a> </li> <li> 2.7 <a href="/book/fr/v2/Les-bases-de-Git-Les-alias-Git">Les alias Git</a> </li> <li> 2.8 <a href="/book/fr/v2/Les-bases-de-Git-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/fr/v2/Les-branches-avec-Git-Les-branches-en-bref">Les branches avec Git</a></h2> <ol> <li> 3.1 <a href="/book/fr/v2/Les-branches-avec-Git-Les-branches-en-bref">Les branches en bref</a> </li> <li> 3.2 <a href="/book/fr/v2/Les-branches-avec-Git-Branches-et-fusions%c2%a0:-les-bases">Branches et fusions : les bases</a> </li> <li> 3.3 <a href="/book/fr/v2/Les-branches-avec-Git-Gestion-des-branches">Gestion des branches</a> </li> <li> 3.4 <a href="/book/fr/v2/Les-branches-avec-Git-Travailler-avec-les-branches">Travailler avec les branches</a> </li> <li> 3.5 <a href="/book/fr/v2/Les-branches-avec-Git-Branches-de-suivi-%c3%a0-distance">Branches de suivi à distance</a> </li> <li> 3.6 <a href="/book/fr/v2/Les-branches-avec-Git-Rebaser-Rebasing">Rebaser (Rebasing)</a> </li> <li> 3.7 <a href="/book/fr/v2/Les-branches-avec-Git-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/fr/v2/Git-sur-le-serveur-Protocoles">Git sur le serveur</a></h2> <ol> <li> 4.1 <a href="/book/fr/v2/Git-sur-le-serveur-Protocoles">Protocoles</a> </li> <li> 4.2 <a href="/book/fr/v2/Git-sur-le-serveur-Installation-de-Git-sur-un-serveur">Installation de Git sur un serveur</a> </li> <li> 4.3 <a href="/book/fr/v2/Git-sur-le-serveur-G%c3%a9n%c3%a9ration-des-cl%c3%a9s-publiques-SSH">Génération des clés publiques SSH</a> </li> <li> 4.4 <a href="/book/fr/v2/Git-sur-le-serveur-Mise-en-place-du-serveur">Mise en place du serveur</a> </li> <li> 4.5 <a href="/book/fr/v2/Git-sur-le-serveur-D%c3%a9mon-Daemon-Git">Démon (Daemon) Git</a> </li> <li> 4.6 <a href="/book/fr/v2/Git-sur-le-serveur-HTTP-intelligent">HTTP intelligent</a> </li> <li> 4.7 <a href="/book/fr/v2/Git-sur-le-serveur-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/fr/v2/Git-sur-le-serveur-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/fr/v2/Git-sur-le-serveur-Git-h%c3%a9berg%c3%a9">Git hébergé</a> </li> <li> 4.10 <a href="/book/fr/v2/Git-sur-le-serveur-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/fr/v2/Git-distribu%c3%a9-D%c3%a9veloppements-distribu%c3%a9s">Git distribué</a></h2> <ol> <li> 5.1 <a href="/book/fr/v2/Git-distribu%c3%a9-D%c3%a9veloppements-distribu%c3%a9s">Développements distribués</a> </li> <li> 5.2 <a href="/book/fr/v2/Git-distribu%c3%a9-Contribution-%c3%a0-un-projet">Contribution à un projet</a> </li> <li> 5.3 <a href="/book/fr/v2/Git-distribu%c3%a9-Maintenance-d%e2%80%99un-projet">Maintenance d’un projet</a> </li> <li> 5.4 <a href="/book/fr/v2/Git-distribu%c3%a9-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/fr/v2/GitHub-Configuration-et-param%c3%a9trage-d%e2%80%99un-compte">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/fr/v2/GitHub-Configuration-et-param%c3%a9trage-d%e2%80%99un-compte">Configuration et paramétrage d’un compte</a> </li> <li> 6.2 <a href="/book/fr/v2/GitHub-Contribution-%c3%a0-un-projet">Contribution à un projet</a> </li> <li> 6.3 <a href="/book/fr/v2/GitHub-Maintenance-d%e2%80%99un-projet">Maintenance d’un projet</a> </li> <li> 6.4 <a href="/book/fr/v2/GitHub-Gestion-d%e2%80%99un-regroupement">Gestion d’un regroupement</a> </li> <li> 6.5 <a href="/book/fr/v2/GitHub-%c3%89criture-de-scripts-pour-GitHub">Écriture de scripts pour GitHub</a> </li> <li> 6.6 <a href="/book/fr/v2/GitHub-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>7. <a href="/book/fr/v2/Utilitaires-Git-S%c3%a9lection-des-versions">Utilitaires Git</a></h2> <ol> <li> 7.1 <a href="/book/fr/v2/Utilitaires-Git-S%c3%a9lection-des-versions">Sélection des versions</a> </li> <li> 7.2 <a href="/book/fr/v2/Utilitaires-Git-Indexation-interactive">Indexation interactive</a> </li> <li> 7.3 <a href="/book/fr/v2/Utilitaires-Git-Remisage-et-nettoyage">Remisage et nettoyage</a> </li> <li> 7.4 <a href="/book/fr/v2/Utilitaires-Git-Signer-votre-travail">Signer votre travail</a> </li> <li> 7.5 <a href="/book/fr/v2/Utilitaires-Git-Recherche">Recherche</a> </li> <li> 7.6 <a href="/book/fr/v2/Utilitaires-Git-R%c3%a9%c3%a9crire-l%e2%80%99historique">Réécrire l’historique</a> </li> <li> 7.7 <a href="/book/fr/v2/Utilitaires-Git-Reset-d%c3%a9mystifi%c3%a9">Reset démystifié</a> </li> <li> 7.8 <a href="/book/fr/v2/Utilitaires-Git-Fusion-avanc%c3%a9e">Fusion avancée</a> </li> <li> 7.9 <a href="/book/fr/v2/Utilitaires-Git-Rerere">Rerere</a> </li> <li> 7.10 <a href="/book/fr/v2/Utilitaires-Git-D%c3%a9boguer-avec-Git">Déboguer avec Git</a> </li> <li> 7.11 <a href="/book/fr/v2/Utilitaires-Git-Sous-modules">Sous-modules</a> </li> <li> 7.12 <a href="/book/fr/v2/Utilitaires-Git-Empaquetage-bundling">Empaquetage (bundling)</a> </li> <li> 7.13 <a href="/book/fr/v2/Utilitaires-Git-Replace">Replace</a> </li> <li> 7.14 <a href="/book/fr/v2/Utilitaires-Git-Stockage-des-identifiants">Stockage des identifiants</a> </li> <li> 7.15 <a href="/book/fr/v2/Utilitaires-Git-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/fr/v2/Personnalisation-de-Git-Configuration-de-Git">Personnalisation de Git</a></h2> <ol> <li> 8.1 <a href="/book/fr/v2/Personnalisation-de-Git-Configuration-de-Git">Configuration de Git</a> </li> <li> 8.2 <a href="/book/fr/v2/Personnalisation-de-Git-Attributs-Git">Attributs Git</a> </li> <li> 8.3 <a href="/book/fr/v2/Personnalisation-de-Git-Crochets-Git">Crochets Git</a> </li> <li> 8.4 <a href="/book/fr/v2/Personnalisation-de-Git-Exemple-de-politique-g%c3%a9r%c3%a9e-par-Git">Exemple de politique gérée par Git</a> </li> <li> 8.5 <a href="/book/fr/v2/Personnalisation-de-Git-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/fr/v2/Git-et-les-autres-syst%c3%a8mes-Git-comme-client">Git et les autres systèmes</a></h2> <ol> <li> 9.1 <a href="/book/fr/v2/Git-et-les-autres-syst%c3%a8mes-Git-comme-client">Git comme client</a> </li> <li> 9.2 <a href="/book/fr/v2/Git-et-les-autres-syst%c3%a8mes-Migration-vers-Git" class="active">Migration vers Git</a> </li> <li> 9.3 <a href="/book/fr/v2/Git-et-les-autres-syst%c3%a8mes-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/fr/v2/Les-tripes-de-Git-Plomberie-et-porcelaine">Les tripes de Git</a></h2> <ol> <li> 10.1 <a href="/book/fr/v2/Les-tripes-de-Git-Plomberie-et-porcelaine">Plomberie et porcelaine</a> </li> <li> 10.2 <a href="/book/fr/v2/Les-tripes-de-Git-Les-objets-de-Git">Les objets de Git</a> </li> <li> 10.3 <a href="/book/fr/v2/Les-tripes-de-Git-R%c3%a9f%c3%a9rences-Git">Références Git</a> </li> <li> 10.4 <a href="/book/fr/v2/Les-tripes-de-Git-Fichiers-group%c3%a9s">Fichiers groupés</a> </li> <li> 10.5 <a href="/book/fr/v2/Les-tripes-de-Git-La-refspec">La refspec</a> </li> <li> 10.6 <a href="/book/fr/v2/Les-tripes-de-Git-Les-protocoles-de-transfert">Les protocoles de transfert</a> </li> <li> 10.7 <a href="/book/fr/v2/Les-tripes-de-Git-Maintenance-et-r%c3%a9cup%c3%a9ration-de-donn%c3%a9es">Maintenance et récupération de données</a> </li> <li> 10.8 <a href="/book/fr/v2/Les-tripes-de-Git-Les-variables-d%e2%80%99environnement">Les variables d’environnement</a> </li> <li> 10.9 <a href="/book/fr/v2/Les-tripes-de-Git-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Interfaces-graphiques">Annexe A: Git dans d’autres environnements</a></h2> <ol> <li> A1.1 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Interfaces-graphiques">Interfaces graphiques</a> </li> <li> A1.2 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Git-dans-Visual-Studio">Git dans Visual Studio</a> </li> <li> A1.3 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Git-dans-Visual-Studio-Code">Git dans Visual Studio Code</a> </li> <li> A1.4 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Git-dans-IntelliJ-/-PyCharm-/-WebStorm-/-PhpStorm-/-RubyMine">Git dans IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine</a> </li> <li> A1.5 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Git-dans-Sublime-Text">Git dans Sublime Text</a> </li> <li> A1.6 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Git-dans-Bash">Git dans Bash</a> </li> <li> A1.7 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Git-dans-Zsh">Git dans Zsh</a> </li> <li> A1.8 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-Git-dans-PowerShell">Git dans PowerShell</a> </li> <li> A1.9 <a href="/book/fr/v2/Annexe-A:-Git-dans-d%e2%80%99autres-environnements-R%c3%a9sum%c3%a9">Résumé</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/fr/v2/Annexe-B:-Embarquer-Git-dans-vos-applications-Git-en-ligne-de-commande">Annexe B: Embarquer Git dans vos applications</a></h2> <ol> <li> A2.1 <a href="/book/fr/v2/Annexe-B:-Embarquer-Git-dans-vos-applications-Git-en-ligne-de-commande">Git en ligne de commande</a> </li> <li> A2.2 <a href="/book/fr/v2/Annexe-B:-Embarquer-Git-dans-vos-applications-Libgit2">Libgit2</a> </li> <li> A2.3 <a href="/book/fr/v2/Annexe-B:-Embarquer-Git-dans-vos-applications-JGit">JGit</a> </li> <li> A2.4 <a href="/book/fr/v2/Annexe-B:-Embarquer-Git-dans-vos-applications-go-git">go-git</a> </li> <li> A2.5 <a href="/book/fr/v2/Annexe-B:-Embarquer-Git-dans-vos-applications-Dulwich">Dulwich</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/fr/v2/Commandes-Git-Installation-et-configuration">Commandes Git</a></h2> <ol> <li> A3.1 <a href="/book/fr/v2/Commandes-Git-Installation-et-configuration">Installation et configuration</a> </li> <li> A3.2 <a href="/book/fr/v2/Commandes-Git-Obtention-et-cr%c3%a9ation-des-projets">Obtention et création des projets</a> </li> <li> A3.3 <a href="/book/fr/v2/Commandes-Git-Capture-d%e2%80%99instantan%c3%a9-basique">Capture d’instantané basique</a> </li> <li> A3.4 <a href="/book/fr/v2/Commandes-Git-Cr%c3%a9ation-de-branches-et-fusion">Création de branches et fusion</a> </li> <li> A3.5 <a href="/book/fr/v2/Commandes-Git-Partage-et-mise-%c3%a0-jour-de-projets">Partage et mise à jour de projets</a> </li> <li> A3.6 <a href="/book/fr/v2/Commandes-Git-Inspection-et-comparaison">Inspection et comparaison</a> </li> <li> A3.7 <a href="/book/fr/v2/Commandes-Git-D%c3%a9bogage">Débogage</a> </li> <li> A3.8 <a href="/book/fr/v2/Commandes-Git-Patchs">Patchs</a> </li> <li> A3.9 <a href="/book/fr/v2/Commandes-Git-Courriel">Courriel</a> </li> <li> A3.10 <a href="/book/fr/v2/Commandes-Git-Syst%c3%a8mes-externes">Systèmes externes</a> </li> <li> A3.11 <a href="/book/fr/v2/Commandes-Git-Administration">Administration</a> </li> <li> A3.12 <a href="/book/fr/v2/Commandes-Git-Commandes-de-plomberie">Commandes de plomberie</a> </li> </ol> </li> </ol> </div> </div> </div> <span class="light" id="edition"> 2nd Edition </span> </div> <div id="main" data-pagefind-filter="category:book" data-pagefind-meta="category:Book" data-pagefind-weight="0.05" data-pagefind-body class="book edition2"> <h1>9.2 Git et les autres systèmes - Migration vers Git</h1> <div> <h2 id="s_migrating">Migration vers Git</h2> <div class="paragraph"> <p> Si vous avez une base de code existant dans un autre Système de Contrôle de Version (SCV) mais que vous avez décidé de commencer à utiliser Git, vous devez migrer votre projet d’une manière ou d’une autre. Cette section passe en revue quelques importateurs pour des systèmes communs, et ensuite démontre comment développer votre propre importateur personnalisé. Vous apprendrez comment importer les données depuis plusieurs des plus gros systèmes de gestion de configuration logicielle (<em>SCM</em>, <em>Software Configuration Management</em>) utilisés professionnellement, parce qu’ils comportent la majorité des utilisateurs qui basculent, et parce que des outils de haute qualité dédiés sont faciles à se procurer.</p> </div> <div class="sect3"> <h3 id="_subversion">Subversion</h3> <div class="paragraph"> <p> Si vous avez lu la section précédente concernant l’utilisation de <code>git svn</code>, vous pouvez utiliser facilement ces instructions pour <code>git svn clone</code> un dépôt ; ensuite, vous pouvez arrêter d’utiliser le serveur Subversion, pousser vers un nouveau serveur Git, et commencer à l’utiliser. Si vous voulez l’historique, vous pouvez obtenir cela aussi rapidement que vous pouvez tirer les données hors du serveur Subversion (ce qui peut prendre un bout de temps).</p> </div> <div class="paragraph"> <p>Cependant, l’import n’est pas parfait ; et comme ça prendra tant de temps, autant le faire correctement. Le premier problème est l’information d’auteur. Dans Subversion, chaque personne qui crée un <em>commit</em> a un utilisateur sur le système qui est enregistré dans l’information de <em>commit</em>. Les exemples dans la section précédente montrent <code>schacon</code> à quelques endroits, comme la sortie de <code>blame</code> et <code>git svn log</code>. Si vous voulez faire correspondre cela à une meilleure donnée d’auteur Git, vous avez besoin d’une transposition des utilisateurs Subversion vers les auteurs Git. Créez un fichier appelé <code>users.txt</code> qui a cette correspondance dans un format tel que celui-ci :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>schacon = Scott Chacon &lt;schacon@geemail.com&gt; selse = Someo Nelse &lt;selse@geemail.com&gt;</code></pre> </div> </div> <div class="paragraph"> <p>Pour obtenir une liste des noms d’auteur que SVN utilise, vous pouvez lancer ceci :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ svn log --xml | grep author | sort -u | \ perl -pe 's/.*&gt;(.*?)&lt;.*/$1 = /'</code></pre> </div> </div> <div class="paragraph"> <p>Cela génère la sortie log dans le format XML, puis garde seulement les lignes avec l’information d’auteur, rejette les doublons, enlève les étiquettes XML. (Bien sûr, cela ne marche que sur une machine ayant <code>grep</code>, <code>sort</code> et <code>perl</code> installés.) Ensuite, redirigez cette sortie dans votre fichier users.txt afin que vous puissiez ajouter l’information d’utilisateur Git équivalente près de chaque entrée.</p> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Note</div> </td> <td class="content"> <div class="paragraph"> <p>Si vous essayez ceci sous Windows, c’est là que vous commencez à avoir des problèmes. Microsoft a fourni quelques bon conseils et exemples sur <a href="https://docs.microsoft.com/en-us/azure/devops/repos/git/perform-migration-from-svn-to-git" class="bare">https://docs.microsoft.com/en-us/azure/devops/repos/git/perform-migration-from-svn-to-git</a>.</p> </div> </td> </tr> </table> </div> <div class="paragraph"> <p>Vous pouvez fournir ce fichier à <code>git svn</code> pour l’aider à faire correspondre la donnée d’auteur plus précisément. Vous pouvez aussi demander à <code>git svn</code> de ne pas inclure les metadonnées que Subversion importe normalement, en passant <code>--no-metadata</code> à la commande <code>clone</code> ou <code>init</code>.</p> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Note</div> </td> <td class="content"> <div class="paragraph"> <p>Vous devez conserver les métadonnées que vous souhaitez faire un miroir des commits réalisés dans le dépôt Git vers le dépôt SVN original. Si vous ne voulez pas de synchronisation dans votre journal de validation, vous pouvez éliminer le paramètre <code>--no-metadata</code>.</p> </div> </td> </tr> </table> </div> <div class="paragraph"> <p>Ceci fait ressembler votre commande <code>import</code> à ceci :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git-svn clone https://my-project.googlecode.com/svn/ \ --authors-file=users.txt --no-metadata -s my_project</code></pre> </div> </div> <div class="paragraph"> <p>Maintenant vous devriez avoir un import Subversion plus joli dans votre dossier <code>my_project</code>. Au lieu de <em>commits</em> qui ressemblent à ceci</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>commit 37efa680e8473b615de980fa935944215428a35a Author: schacon &lt;schacon@4c93b258-373f-11de-be05-5f7a86268029&gt; Date: Sun May 3 00:12:22 2009 +0000 fixed install - go to trunk git-svn-id: https://my-project.googlecode.com/svn/trunk@94 4c93b258-373f-11de- be05-5f7a86268029</code></pre> </div> </div> <div class="paragraph"> <p>ils ressemblent à ceci :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>commit 03a8785f44c8ea5cdb0e8834b7c8e6c469be2ff2 Author: Scott Chacon &lt;schacon@geemail.com&gt; Date: Sun May 3 00:12:22 2009 +0000 fixed install - go to trunk</code></pre> </div> </div> <div class="paragraph"> <p>Non seulement le champ Auteur a l’air beaucoup mieux, mais le <code>git-svn-id</code> n’est plus là non plus.</p> </div> <div class="paragraph"> <p>Vous devriez aussi faire un peu de ménage post-import. D’abord, vous devriez nettoyer les références bizarres que <code>git svn</code> a installées. Premièrement vous déplacerez les étiquettes afin qu’elles soient de véritables étiquettes plutôt que d’étranges branches distantes, et ensuite vous déplacerez le reste des branches afin qu’elles soient locales.</p> </div> <div class="paragraph"> <p>Pour déplacer les étiquettes pour qu’elles soient des étiquettes Git propres, lancez</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ for t in $(git for-each-ref --format='%(refname:short)' refs/remotes/tags); do git tag ${t/tags\//} $t &amp;&amp; git branch -D -r $t; done</code></pre> </div> </div> <div class="paragraph"> <p>Ceci prend les références qui étaient des branches distantes qui commençaient par <code>remotes/origin/tags</code> et en fait de vraies étiquettes (légères).</p> </div> <div class="paragraph"> <p>Ensuite, déplacez le reste des références sous <code>refs/remotes</code> pour qu’elles soient des branches locales :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ for b in $(git for-each-ref --format='%(refname:short)' refs/remotes); do git branch $b refs/remotes/$b &amp;&amp; git branch -D -r $b; done</code></pre> </div> </div> <div class="paragraph"> <p>Il peut arriver que vous voyiez quelques autres branches qui sont suffixées par <code>@xxx</code> (où xxx est un nombre), alors que dans Subversion vous ne voyez qu’une seule branche. C’est en fait une fonctionnalité Subversion appelée « peg-revisions », qui est quelque chose pour laquelle Git n’a tout simplement pas d’équivalent syntaxique. Donc, <code>git svn</code> ajoute simplement le numéro de version svn au nom de la branche de la même façon que vous l’auriez écrit dans svn pour adresser la « peg-revision » de cette branche. Si vous ne vous souciez plus des « peg-revisions », supprimez-les simplement en utilisant <code>git branch -d</code>.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ for p in $(git for-each-ref --format='%(refname:short)' | grep @); do git branch -D $p; done</code></pre> </div> </div> <div class="paragraph"> <p>Maintenant toutes les vieilles branches sont de vraies branches Git et toutes les vieilles étiquettes sont de vraies étiquettes Git.</p> </div> <div class="paragraph"> <p>Il y a une dernière chose à nettoyer. Malheureusement, <code>git svn</code> crée une branche supplémentaire appelée <code>trunk</code>, qui correspond à la branche par défaut de Subversion, mais la ref <code>trunk</code> pointe au même endroit que <code>master</code>. Comme <code>master</code> est plus idiomatiquement Git, voici comment supprimer la branche supplémentaire :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git branch -d trunk</code></pre> </div> </div> <div class="paragraph"> <p>La dernière chose à faire est d’ajouter votre nouveau serveur Git en tant que serveur distant et pousser vers lui. Voici un exemple d’ajout de votre serveur en tant que serveur distant :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git remote add origin git@my-git-server:myrepository.git</code></pre> </div> </div> <div class="paragraph"> <p>Puisque vous voulez que vos branches et étiquettes montent, vous pouvez maintenant lancer :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git push origin --all $ git push origin --tags</code></pre> </div> </div> <div class="paragraph"> <p>Toutes vos branches et étiquettes devraient être sur votre nouveau serveur Git dans un import joli et propre.</p> </div> </div> <div class="sect3"> <h3 id="_mercurial">Mercurial</h3> <div class="paragraph"> <p> Puisque Mercurial et Git ont des modèles assez similaires pour représenter les versions, et puisque Git est un peu plus flexible, convertir un dépôt depuis Mercurial vers Git est assez simple, en utilisant un outil appelé "hg-fast-export", duquel vous aurez besoin d’une copie :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git clone https://github.com/frej/fast-export.git</code></pre> </div> </div> <div class="paragraph"> <p>La première étape dans la conversion est d’obtenir un clone complet du dépôt Mercurial que vous voulez convertir :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ hg clone &lt;remote repo URL&gt; /tmp/hg-repo</code></pre> </div> </div> <div class="paragraph"> <p>L’étape suivante est de créer un fichier d’association d’auteur. Mercurial est un peu plus indulgent que Git pour ce qu’il mettra dans le champ auteur pour les modifications, donc c’est le bon moment pour faire le ménage. La génération de ceci tient en une ligne de commande dans un shell <code>bash</code> :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ cd /tmp/hg-repo $ hg log | grep user: | sort | uniq | sed 's/user: *//' &gt; ../authors</code></pre> </div> </div> <div class="paragraph"> <p>Cela prendra quelques secondes, en fonction de la longueur de l’historique de votre projet, et ensuite le fichier <code>/tmp/authors</code> ressemblera à quelque chose comme ceci :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>bob bob@localhost bob &lt;bob@company.com&gt; bob jones &lt;bob &lt;AT&gt; company &lt;DOT&gt; com&gt; Bob Jones &lt;bob@company.com&gt; Joe Smith &lt;joe@company.com&gt;</code></pre> </div> </div> <div class="paragraph"> <p>Dans cet exemple, la même personne (Bob) a créé des modifications sous différents noms, dont l’un est correct, et dont un autre est complètement invalide pour un <em>commit</em> Git. Hg-fast-import nous laisse régler cela en transformant chaque ligne en règle : <code>"&lt;source&gt;"="&lt;cible&gt;", qui transforme une `&lt;source&gt;</code> en <code>&lt;cible&gt;</code>. Dans les chaînes <code>&lt;source&gt;</code> et <code>&lt;cible&gt;</code>, toutes les séquences d’échappement supportées par la fonction python <code>string_escape</code> sont prises en charge. Si le fichier de transformation d’auteurs ne contient pas de correspondance avec <code>&lt;source&gt;</code>, cet auteur sera envoyé à Git sans modification. Dans cet exemple, nous voulons que notre fichier ressemble à cela :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>bob=Bob Jones &lt;bob@company.com&gt; bob@localhost=Bob Jones &lt;bob@company.com&gt; bob jones &lt;bob &lt;AT&gt; company &lt;DOT&gt; com&gt;=Bob Jones &lt;bob@company.com&gt; bob &lt;bob@company.com&gt;=Bob Jones &lt;bob@company.com&gt;</code></pre> </div> </div> <div class="paragraph"> <p>Le même type de fichier de correspondance peut être utilisé pour renommer les branches et les étiquettes lorsque le nom Mercurial n’est pas permis dans Git.</p> </div> <div class="paragraph"> <p>L’étape suivante consiste à créer notre nouveau dépôt Git, et à lancer le script d’export :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git init /tmp/converted $ cd /tmp/converted $ /tmp/fast-export/hg-fast-export.sh -r /tmp/hg-repo -A /tmp/authors</code></pre> </div> </div> <div class="paragraph"> <p>L’option <code>-r</code> indique à hg-fast-export où trouver le dépôt Mercurial que l’on veut convertir, et l’option <code>-A</code> lui indique où trouver le fichier de correspondance d’auteur. Le script analyse les modifications Mercurial et les convertit en un script pour la fonctionnalité "fast-import" de Git (que nous détaillerons un peu plus tard). Cela prend un peu de temps (bien que ce soit <em>beaucoup plus</em> rapide que si c’était à travers le réseau), et la sortie est assez verbeuse :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ /tmp/fast-export/hg-fast-export.sh -r /tmp/hg-repo -A /tmp/authors Loaded 4 authors master: Exporting full revision 1/22208 with 13/0/0 added/changed/removed files master: Exporting simple delta revision 2/22208 with 1/1/0 added/changed/removed files master: Exporting simple delta revision 3/22208 with 0/1/0 added/changed/removed files […] master: Exporting simple delta revision 22206/22208 with 0/4/0 added/changed/removed files master: Exporting simple delta revision 22207/22208 with 0/2/0 added/changed/removed files master: Exporting thorough delta revision 22208/22208 with 3/213/0 added/changed/removed files Exporting tag [0.4c] at [hg r9] [git :10] Exporting tag [0.4d] at [hg r16] [git :17] […] Exporting tag [3.1-rc] at [hg r21926] [git :21927] Exporting tag [3.1] at [hg r21973] [git :21974] Issued 22315 commands git-fast-import statistics: --------------------------------------------------------------------- Alloc'd objects: 120000 Total objects: 115032 ( 208171 duplicates ) blobs : 40504 ( 205320 duplicates 26117 deltas of 39602 attempts) trees : 52320 ( 2851 duplicates 47467 deltas of 47599 attempts) commits: 22208 ( 0 duplicates 0 deltas of 0 attempts) tags : 0 ( 0 duplicates 0 deltas of 0 attempts) Total branches: 109 ( 2 loads ) marks: 1048576 ( 22208 unique ) atoms: 1952 Memory total: 7860 KiB pools: 2235 KiB objects: 5625 KiB --------------------------------------------------------------------- pack_report: getpagesize() = 4096 pack_report: core.packedGitWindowSize = 1073741824 pack_report: core.packedGitLimit = 8589934592 pack_report: pack_used_ctr = 90430 pack_report: pack_mmap_calls = 46771 pack_report: pack_open_windows = 1 / 1 pack_report: pack_mapped = 340852700 / 340852700 --------------------------------------------------------------------- $ git shortlog -sn 369 Bob Jones 365 Joe Smith</code></pre> </div> </div> <div class="paragraph"> <p>C’est à peu près tout ce qu’il y a. Toutes les étiquettes Mercurial ont été converties en étiquettes Git, et les branches et marques-page Mercurial ont été convertis en branches Git. Maintenant vous êtes prêt à pousser le dépôt vers son nouveau serveur d’hébergement :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git remote add origin git@my-git-server:myrepository.git $ git push origin --all</code></pre> </div> </div> </div> <div class="sect3"> <h3 id="s_perforce_import">Perforce</h3> <div class="paragraph"> <p> Le système suivant dont vous allez voir l’importation est Perforce. Ainsi que nous l’avons dit plus haut, il y a deux façons de permettre de faire parler Git et Perforce l’un avec l’autre : git-p4 et Perforce Git Fusion.</p> </div> <div class="sect4"> <h4 id="_perforce_git_fusion">Perforce Git Fusion</h4> <div class="paragraph"> <p>Git Fusion rend ce processus assez indolore. Configurez les paramètres de votre projet, les correspondances utilisateur et les branches en utilisant un fichier de configuration (comme discuté dans ch09-git-and-other-systems#s_p4_git_fusion&gt;&gt;), et clonez le dépôt. Git Fusion vous laisse avec ce qui ressemble à un dépôt Git natif, qui est alors prêt à être poussé vers un hôte Git natif si vous le désirez. Vous pouvez même utiliser Perforce comme hôte Git si vous ça vous plaît.</p> </div> </div> <div class="sect4"> <h4 id="s_sect_git_p4">Git-p4</h4> <div class="paragraph"> <p>Git-p4 peut aussi agir comme outil d’import. Comme exemple, nous importerons le projet Jam depuis le Dépôt Public Perforce. Pour définir votre client, vous devez exporter la variable d’environnement P4PORT pour pointer vers le dépôt Perforce :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ export P4PORT=public.perforce.com:1666</code></pre> </div> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Note</div> </td> <td class="content"> <div class="paragraph"> <p>Pour suivre tout le long, vous aurez besoin d’un dépôt Perforce auquel vous connecter. Nous utiliserons le dépôt public à public.perforce.com pour nos exemples, mais vous pouvez utiliser n’importe quel dépôt auquel vous avez accès.</p> </div> </td> </tr> </table> </div> <div class="paragraph"> <p> Lancez la commande <code>git p4 clone</code> pour importer le projet Jam depuis le serveur Perforce, en fournissant le chemin vers le dépôt et le projet dans lequel vous voulez importer le projet :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git-p4 clone //guest/perforce_software/jam@all p4import Importing from //guest/perforce_software/jam@all into p4import Initialized empty Git repository in /private/tmp/p4import/.git/ Import destination: refs/remotes/p4/master Importing revision 9957 (100%)</code></pre> </div> </div> <div class="paragraph"> <p>Ce projet particulier a seulement une branche, mais si vous avez des branches configurées avec des vues de branche (ou juste un ensemble de dossiers), vous pouvez utiliser l’option <code>--detect-branches</code> avec <code>git p4 clone</code> pour importer aussi toutes les branches du projet. Voyez ch09-git-and-other-systems#s_git_p4_branches&gt;&gt; pour plus de détails sur ceci.</p> </div> <div class="paragraph"> <p>A ce point, vous avez presque terminé. Si vous allez dans le dossier <code>p4import</code> et lancez <code>git log</code>, vous pouvez voir le travail importé :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log -2 commit e5da1c909e5db3036475419f6379f2c73710c4e6 Author: giles &lt;giles@giles@perforce.com&gt; Date: Wed Feb 8 03:13:27 2012 -0800 Correction to line 355; change &lt;/UL&gt; to &lt;/OL&gt;. [git-p4: depot-paths = "//public/jam/src/": change = 8068] commit aa21359a0a135dda85c50a7f7cf249e4f7b8fd98 Author: kwirth &lt;kwirth@perforce.com&gt; Date: Tue Jul 7 01:35:51 2009 -0800 Fix spelling error on Jam doc page (cummulative -&gt; cumulative). [git-p4: depot-paths = "//public/jam/src/": change = 7304]</code></pre> </div> </div> <div class="paragraph"> <p>Vous pouvez voir que <code>git-p4</code> a laissé un identifiant dans chaque message de <em>commit</em>. C’est bien de garder cet identifiant-là, au cas où vous auriez besoin de référencer le numéro de changement Perforce plus tard. Cependant, si vous souhaitez enlever l’identifiant, c’est maintenant le moment de le faire – avant que vous ne commenciez à travailler sur le nouveau dépôt. Vous pouvez utiliser <code>git filter-branch</code> pour enlever en masse les chaînes d’identifiant :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git filter-branch --msg-filter 'sed -e "/^\[git-p4:/d"' Rewrite e5da1c909e5db3036475419f6379f2c73710c4e6 (125/125) Ref 'refs/heads/master' was rewritten</code></pre> </div> </div> <div class="paragraph"> <p>Si vous lancez <code>git log</code>, vous pouvez voir que toutes les sommes de vérification SHA-1 pour les <em>commits</em> ont changé, mais les chaînes <code>git-p4</code> ne sont plus dans les messages de <em>commit</em> :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log -2 commit b17341801ed838d97f7800a54a6f9b95750839b7 Author: giles &lt;giles@giles@perforce.com&gt; Date: Wed Feb 8 03:13:27 2012 -0800 Correction to line 355; change &lt;/UL&gt; to &lt;/OL&gt;. commit 3e68c2e26cd89cb983eb52c024ecdfba1d6b3fff Author: kwirth &lt;kwirth@perforce.com&gt; Date: Tue Jul 7 01:35:51 2009 -0800 Fix spelling error on Jam doc page (cummulative -&gt; cumulative).</code></pre> </div> </div> <div class="paragraph"> <p>Votre import est prêt à être poussé vers votre nouveau serveur Git.</p> </div> </div> </div> <div class="sect3"> <h3 id="s_custom_importer">Un importateur personnalisé</h3> <div class="paragraph"> <p> Si votre système n’est pas un de ceux ci-dessus, vous devriez chercher un importateur en ligne – des importateurs de qualité sont disponibles pour plein d’autres systèmes, incluant CVS, Clear Case, Visual Source Safe, même un dossier d’archives. Si aucun de ces outils ne fonctionne pour vous, vous avez un outil plus obscur, ou alors vous avez besoin d’un procédé d’importation personnalisé, vous devriez utiliser <code>git fast-import</code>. Cette commande lit des instructions simples depuis l’entrée standard pour écrire des données Git spécifiques. Il est bien plus facile de créer des objets Git de cette façon que de lancer des commandes Git brutes ou que d’essayer d’écrire les objets bruts (voir <a href="/book/fr/v2/ch00/ch10-git-internals">Les tripes de Git</a> pour plus d’informations). De cette façon, vous pouvez écrire un script d’importation qui lit l’information nécessaire hors du système duquel vous importez et qui affiche les instructions directement dans la sortie standard. Vous pouvez alors lancer ce programme et envoyer sa sortie à travers un tube dans <code>git fast-import</code>.</p> </div> <div class="paragraph"> <p>Pour démontrer rapidement, vous écrirez un importateur simple. Supposez que vous travaillez dans <code>current</code>, vous sauvegardez votre projet en copiant occasionnellement le dossier dans un dossier de sauvegarde estampillé de la date <code>back_YYYY_MM_DD</code>, et vous voulez importer cela dans Git. Votre structure de dossier ressemble à ceci :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ ls /opt/import_from back_2014_01_02 back_2014_01_04 back_2014_01_14 back_2014_02_03 current</code></pre> </div> </div> <div class="paragraph"> <p>Pour importer un dossier Git, vous devez passer en revue comment Git stocke ses données. Comme vous vous le rappelez, Git est fondamentalement une liste liée d’objets <em>commit</em> qui pointent sur un instantané de contenu. Tout ce que vous avez à faire est de dire à <code>fast-import</code> ce que sont les instantanés de contenu, quelles données de <em>commit</em> pointent sur eux, et l’ordre dans lequel ils vont. Votre stratégie sera d’explorer les instantanés un à un et créer les <em>commits</em> avec les contenus dans chaque dossier, en liant chaque <em>commit</em> avec le précédent.</p> </div> <div class="paragraph"> <p>Comme nous l’avons fait dans <a href="/book/fr/v2/ch00/s_an_example_git_enforced_policy">Exemple de politique gérée par Git</a>, nous écrirons ceci en Ruby, parce que c’est ce avec quoi nous travaillons généralement et ça a tendance à être facile à lire. Vous pouvez écrire cet exemple assez facilement avec n’importe quel langage de programmation auquel vous êtes familier – il faut seulement afficher l’information appropriée dans <code>stdout</code>. Et, si vous travaillez sous Windows, cela signifie que vous devrez prendre un soin particulier à ne pas introduire de retour chariot (carriage return, CR) à la fin de vos lignes – <code>git fast-import</code> est très exigeant ; il accepte seulement la fin de ligne (Line Feed, LF) et pas le retour chariot fin de ligne (CRLF) que Windows utilise.</p> </div> <div class="paragraph"> <p>Pour commencer, vous vous placerez dans le dossier cible et identifierez chaque sous-dossier, chacun étant un instantané que vous voulez importer en tant que <em>commit</em>. Vous vous placerez dans chaque sous-dossier et afficherez les commandes nécessaires pour l’exporter. Votre boucle basique principale ressemble à ceci :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">last_mark = nil # boucle sur les dossiers Dir.chdir(ARGV[0]) do Dir.glob("*").each do |dir| next if File.file?(dir) # rentre dans chaque dossier cible Dir.chdir(dir) do last_mark = print_export(dir, last_mark) end end end</code></pre> </div> </div> <div class="paragraph"> <p>Vous lancez <code>print_export</code> à l’intérieur de chaque dossier, qui prend le manifeste et la marque de l’instantané précédent et retourne la marque et l’empreinte de celui-ci ; de cette façon, vous pouvez les lier proprement. <code>`Marque'' est le terme de `fast-import</code> pour un identifiant que vous donnez à un <em>commit</em> ; au fur et à mesure que vous créez des <em>commits</em>, vous donnez à chacun une marque que vous pouvez utiliser pour le lier aux autres <em>commits</em>. Donc, la première chose à faire dans votre méthode <code>print_export</code> est de générer une marque à partir du nom du dossier :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">mark = convert_dir_to_mark(dir)</code></pre> </div> </div> <div class="paragraph"> <p>Vous ferez ceci en créant un tableau de dossiers et en utilisant la valeur d’index comme marque, car une marque doit être un nombre entier. Votre méthode ressemble à ceci :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">$marks = [] def convert_dir_to_mark(dir) if !$marks.include?(dir) $marks &lt;&lt; dir end ($marks.index(dir) + 1).to_s end</code></pre> </div> </div> <div class="paragraph"> <p>Maintenant que vous avez une représentation par un entier de votre <em>commit</em>, vous avez besoin d’une date pour les métadonnées du <em>commit</em>. Puisque la date est exprimée dans le nom du dossier, vous l’analyserez. La ligne suivante dans votre fichier <code>print_export</code> est</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">date = convert_dir_to_date(dir)</code></pre> </div> </div> <div class="paragraph"> <p>où <code>convert_dir_to_date</code> est définie comme</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">def convert_dir_to_date(dir) if dir == 'current' return Time.now().to_i else dir = dir.gsub('back_', '') (year, month, day) = dir.split('_') return Time.local(year, month, day).to_i end end</code></pre> </div> </div> <div class="paragraph"> <p>Cela retourne une valeur entière pour la date de chaque dossier. Le dernier bout de méta-information dont vous avez besoin pour chaque <em>commit</em> est la donnée de l’auteur, que vous codez en dur dans une variable globale :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">$author = 'John Doe &lt;john@example.com&gt;'</code></pre> </div> </div> <div class="paragraph"> <p>Maintenant vous êtes prêt à commencer à publier l’information de <em>commit</em> pour votre importateur. L’information initiale déclare que vous êtes en train de définir un objet <em>commit</em> et sur quelle branche il est, suivi de la marque que vous avez générée, l’information d’auteur et le message de <em>commit</em>, et ensuite le précédent <em>commit</em>, s’il y en a un. Le code ressemble à ceci :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby"># affiche l'information d'import puts 'commit refs/heads/master' puts 'mark :' + mark puts "committer #{$author} #{date} -0700" export_data('imported from ' + dir) puts 'from :' + last_mark if last_mark</code></pre> </div> </div> <div class="paragraph"> <p>Vous codez en dur le fuseau horaire (-0700) parce que c’est facile de faire ainsi. Si vous importez depuis un autre système, vous devez spécifier le fuseau horaire comme décalage. Le message de <em>commit</em> doit être exprimé dans un format spécial :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>data (taille)\n(contenu)</code></pre> </div> </div> <div class="paragraph"> <p>Le format est constitué du mot data, de la taille de la donnée à lire, d’une nouvelle ligne et finalement de la donnée. Comme vous avez besoin d’utiliser le même format pour spécifier le contenu du fichier plus tard, vous créez une méthode assistante, <code>export_data</code> :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">def export_data(string) print "data #{string.size}\n#{string}" end</code></pre> </div> </div> <div class="paragraph"> <p>Tout ce qui reste à faire est de spécifier le contenu du fichier pour chaque instantané. C’est facile, car vous les avez dans un dossier – vous pouvez imprimer la commande <code>deleteall</code> suivie par le contenu de chaque fichier du dossier. Git enregistrera ensuite chaque instantané de manière appropriée :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">puts 'deleteall' Dir.glob("**/*").each do |file| next if !File.file?(file) inline_data(file) end</code></pre> </div> </div> <div class="paragraph"> <p>Note : Comme beaucoup de systèmes conçoivent leurs révisions comme des changements d’un <em>commit</em> à l’autre, fast-import peut aussi prendre des commandes avec chaque <em>commit</em> pour spécifier quels fichiers ont été ajoutés, supprimés ou modifiés et ce qu’est le nouveau contenu. Vous pourriez calculer les différences entre instantanés et fournir seulement cette donnée, mais faire ainsi est plus complexe – vous pouvez aussi bien donner à Git toutes les données et le laisser faire. Si cela convient mieux pour vos données, référez-vous à la page de manuel <code>fast-import</code> pour les détails sur la manière de fournir les données de cette façon.</p> </div> <div class="paragraph"> <p>Le format pour lister le contenu d’un nouveau fichier ou pour spécifier un fichier modifié avec le nouveau contenu est le suivant :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>M 644 inline path/to/file data (taille) (contenu du fichier)</code></pre> </div> </div> <div class="paragraph"> <p>Ici, 644 est le mode (si vous avez des fichiers exécutables, vous devez le détecter et spécifier 755 à la place), et <code>inline</code> dit que vous listerez le contenu immédiatement après cette ligne. Votre méthode <code>inline_data</code> ressemble à ceci :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">def inline_data(file, code = 'M', mode = '644') content = File.read(file) puts "#{code} #{mode} inline #{file}" export_data(content) end</code></pre> </div> </div> <div class="paragraph"> <p>Vous réutilisez la méthode <code>export_data</code> que vous avez définie plus tôt, parce que c’est de la même façon que vous avez spécifié vos données du message de <em>commit</em>.</p> </div> <div class="paragraph"> <p>La dernière chose que vous avez besoin de faire est de retourner la marque courante pour qu’elle soit passée à la prochaine itération :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">return mark</code></pre> </div> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Note</div> </td> <td class="content"> <div class="paragraph"> <p>Si vous êtes sous Windows, vous devrez vous assurer d’ajouter une étape supplémentaire. Comme mentionné précédemment, Windows utilise CRLF comme caractères de fin de ligne alors que <code>git fast-import</code> ne s’attend qu’à LF. Pour contourner ce problème et satisfaire <code>git fast-import</code>, vous devez indiquer à Ruby d’utiliser LF au lieu de CRLF :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">$stdout.binmode</code></pre> </div> </div> </td> </tr> </table> </div> <div class="paragraph"> <p>Et voilà. Voici le script dans son intégralité :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ruby" data-lang="ruby">#!/usr/bin/env ruby $stdout.binmode $author = "John Doe &lt;john@example.com&gt;" $marks = [] def convert_dir_to_mark(dir) if !$marks.include?(dir) $marks &lt;&lt; dir end ($marks.index(dir)+1).to_s end def convert_dir_to_date(dir) if dir == 'current' return Time.now().to_i else dir = dir.gsub('back_', '') (year, month, day) = dir.split('_') return Time.local(year, month, day).to_i end end def export_data(string) print "data #{string.size}\n#{string}" end def inline_data(file, code='M', mode='644') content = File.read(file) puts "#{code} #{mode} inline #{file}" export_data(content) end def print_export(dir, last_mark) date = convert_dir_to_date(dir) mark = convert_dir_to_mark(dir) puts 'commit refs/heads/master' puts "mark :#{mark}" puts "committer #{$author} #{date} -0700" export_data("imported from #{dir}") puts "from :#{last_mark}" if last_mark puts 'deleteall' Dir.glob("**/*").each do |file| next if !File.file?(file) inline_data(file) end mark end # explore les dossiers last_mark = nil Dir.chdir(ARGV[0]) do Dir.glob("*").each do |dir| next if File.file?(dir) # move into the target directory Dir.chdir(dir) do last_mark = print_export(dir, last_mark) end end end</code></pre> </div> </div> <div class="paragraph"> <p>Si vous lancez ce script, vous obtiendrez un contenu qui ressemble à peu près à ceci :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ ruby import.rb /opt/import_from commit refs/heads/master mark :1 committer John Doe &lt;john@example.com&gt; 1388649600 -0700 data 29 imported from back_2014_01_02deleteall M 644 inline README.md data 28 # Hello This is my readme. commit refs/heads/master mark :2 committer John Doe &lt;john@example.com&gt; 1388822400 -0700 data 29 imported from back_2014_01_04from :1 deleteall M 644 inline main.rb data 34 #!/bin/env ruby puts "Hey there" M 644 inline README.md (...)</code></pre> </div> </div> <div class="paragraph"> <p>Pour lancer l’importateur, envoyez à travers un tube cette sortie à <code>git fast-import</code> pendant que vous êtes dans le dossier Git dans lequel vous voulez importer. Vous pouvez créer un nouveau dossier et ensuite exécuter <code>git init</code> à l’intérieur de celui-ci comme point de départ, et ensuite exécuter votre script :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git init Initialized empty Git repository in /opt/import_to/.git/ $ ruby import.rb /opt/import_from | git fast-import git-fast-import statistics: --------------------------------------------------------------------- Alloc'd objects: 5000 Total objects: 13 ( 6 duplicates ) blobs : 5 ( 4 duplicates 3 deltas of 5 attempts) trees : 4 ( 1 duplicates 0 deltas of 4 attempts) commits: 4 ( 1 duplicates 0 deltas of 0 attempts) tags : 0 ( 0 duplicates 0 deltas of 0 attempts) Total branches: 1 ( 1 loads ) marks: 1024 ( 5 unique ) atoms: 2 Memory total: 2344 KiB pools: 2110 KiB objects: 234 KiB --------------------------------------------------------------------- pack_report: getpagesize() = 4096 pack_report: core.packedGitWindowSize = 1073741824 pack_report: core.packedGitLimit = 8589934592 pack_report: pack_used_ctr = 10 pack_report: pack_mmap_calls = 5 pack_report: pack_open_windows = 2 / 2 pack_report: pack_mapped = 1457 / 1457 ---------------------------------------------------------------------</code></pre> </div> </div> <div class="paragraph"> <p>Comme vous pouvez le voir, lorsque c’est terminé avec succès, il vous donne un lot de statistiques sur ce qu’il a fait. Dans ce cas-ci, vous avez importé un total de 13 objets pour 4 <em>commits</em> dans une branche. Maintenant, vous pouvez lancer <code>git log</code> pour voir votre nouvel historique :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log -2 commit 3caa046d4aac682a55867132ccdfbe0d3fdee498 Author: John Doe &lt;john@example.com&gt; Date: Tue Jul 29 19:39:04 2014 -0700 imported from current commit 4afc2b945d0d3c8cd00556fbe2e8224569dc9def Author: John Doe &lt;john@example.com&gt; Date: Mon Feb 3 01:00:00 2014 -0700 imported from back_2014_02_03</code></pre> </div> </div> <div class="paragraph"> <p>Vous y voilà — un dépôt Git beau et propre. Il est important de noter que rien n’est extrait – vous n’avez d’abord aucun fichier dans votre répertoire de travail. Pour les obtenir, vous devez réinitialiser votre branche là où <code>master</code> est maintenant :</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ ls $ git reset --hard master HEAD is now at 3caa046 imported from current $ ls README.md main.rb</code></pre> </div> </div> <div class="paragraph"> <p>Vous pouvez faire beaucoup plus avec l’outil <code>fast-import</code> – manipuler différents modes, les données binaires, les branches multiples et la fusion, les étiquettes, les indicateurs de progression, et plus encore. Nombre d’exemples de scénarios plus complexes sont disponibles dans le dossier <code>contrib/fast-import</code> du code source Git.</p> </div> </div> <div id="nav"><a href="/book/fr/v2/Git-et-les-autres-systèmes-Git-comme-client">prev</a> | <a href="/book/fr/v2/Git-et-les-autres-systèmes-Résumé">next</a></div> </div> </div> </div> </div> <footer> <div class="site-source"> <a href="/site">About this site</a><br> Patches, suggestions, and comments are welcome. </div> <div class="sfc-member"> Git is a member of <a href="/sfc">Software Freedom Conservancy</a> </div> </footer> <a href="#top" class="no-js scrollToTop" id="scrollToTop" data-label="Scroll to top"> <img src="/images/icons/chevron-up@2x.png" width="20" height="20" alt="scroll-to-top"/> </a> <script src="/js/jquery-1.7.1.min.js"></script> <script src="/js/jquery-ui-1.8.18.custom.min.js"></script> <script src="/js/jquery.defaultvalue.js"></script> <script src="/js/session.min.js"></script> <script src="/js/application.min.js"></script> </div> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10