Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
- 2.45.1 → 2.47.0 no changes
- 2.45.0 04/29/24
- 2.44.1 → 2.44.2 no changes
- 2.44.0 02/23/24
- 2.43.1 → 2.43.5 no changes
- 2.43.0 11/20/23
- 2.38.1 → 2.42.3 no changes
- 2.38.0 10/02/22
- 2.29.1 → 2.37.7 no changes
- 2.29.0 10/19/20
- 2.28.1 no changes
- 2.28.0 07/27/20
- 2.27.1 no changes
- 2.27.0 06/01/20
- 2.24.2 → 2.26.3 no changes
- 2.24.1 12/06/19
- 2.24.0 11/04/19
- 2.23.2 → 2.23.4 no changes
- 2.23.1 12/06/19
- 2.23.0 08/16/19
- 2.22.3 → 2.22.5 no changes
- 2.22.2 12/06/19
- 2.22.1 no changes
- 2.22.0 06/07/19
- 2.21.2 → 2.21.4 no changes
- 2.21.1 12/06/19
- 2.21.0 02/24/19
- 2.20.3 → 2.20.5 no changes
- 2.20.2 12/06/19
- 2.20.1 no changes
- 2.20.0 no changes
- 2.19.4 → 2.19.6 no changes
- 2.19.3 12/06/19
- 2.19.1 → 2.19.2 no changes
- 2.19.0 no changes
- 2.18.3 → 2.18.5 no changes
- 2.18.2 12/06/19
- 2.18.1 no changes
- 2.18.0 06/21/18
- 2.17.4 → 2.17.6 no changes
- 2.17.3 12/06/19
- 2.17.1 → 2.17.2 no changes
- 2.17.0 no changes
- 2.15.4 → 2.16.6 no changes
- 2.14.6 12/06/19
- 2.11.4 → 2.13.7 no changes
- 2.10.5 09/22/17
- 2.9.5 07/30/17
- 2.7.6 → 2.8.6 no changes
- 2.6.7 05/05/17
- 2.5.6 no changes
- 2.4.12 05/05/17
- 2.3.10 no changes
- 2.2.3 09/04/15
- 2.1.4 12/17/14
- 2.0.5 12/17/14
DESCRIPTION
Ce programme n’est gĂ©nĂ©ralement pas ce que l’utilisateur final veut exĂ©cuter directement. La plupart des utilisateurs finaux veulent utiliser l’un des programmes frontaux existants, qui analyse un type spĂ©cifique de source Ă©trangĂšre et alimente le contenu stockĂ© dans git fast-import.
fast-import lit un flux mixte de commandes/donnĂ©es depuis l’entrĂ©e standard et Ă©crit un ou plusieurs fichers paquets directement dans le dĂ©pĂŽt actuel. Lorsque EOF est reçu sur l’entrĂ©e standard, fast-import Ă©crit les refs de branches et d’Ă©tiquettes mis Ă jour, mettant ainsi Ă jour le dĂ©pĂŽt actuel avec les donnĂ©es nouvellement importĂ©es.
Le backend fast-import lui-mĂȘme peut importer dans un dĂ©pĂŽt vide (un dĂ©pĂŽt qui a dĂ©jĂ Ă©tĂ© initialisĂ© par git init) ou mettre Ă jour de maniĂšre incrĂ©mentielle un dĂ©pĂŽt existant peuplĂ©. Le fait que les importations incrĂ©mentales soient supportĂ©es ou non Ă partir d’une source Ă©trangĂšre particuliĂšre dĂ©pend du programme frontal utilisĂ©.
OPTIONS
- --force
-
Forcer la mise Ă jour des branches existantes modifiĂ©es, mĂȘme si cela entraĂźne la perte de commits (car le nouveau commit ne contient pas l’ancien).
- --quiet
-
DĂ©sactiver la sortie affichĂ©e par --stats, rendant fast-import habituellement silencieux quand il est rĂ©ussi. Cependant, si le flux d’importation a des directives destinĂ©es Ă montrer la sortie utilisateur (par exemple les directives
progress
), les messages correspondants seront toujours affichés. - --stats
-
Afficher quelques statistiques de base sur les objets que fast-import a crĂ©Ă©s, les fichiers paquets dans lesquels ils ont Ă©tĂ© stockĂ©s, et la mĂ©moire utilisĂ©e par fast-import pendant cette exĂ©cution. L’affichage de cette sortie est actuellement la valeur par dĂ©faut, mais peut ĂȘtre dĂ©sactivĂ© avec --quiet.
- --allow-unsafe-features
-
De nombreuses options de ligne de commande peuvent ĂȘtre fournies dans le flux de fast-import lui-mĂȘme en utilisant les commandes
feature
ouoption
. Cependant, certaines de ces options ne sont pas sĂ»res (par exemple, permettre Ă fast-import d’accĂ©der au systĂšme de fichiers en dehors du dĂ©pĂŽt). Ces options sont dĂ©sactivĂ©es par dĂ©faut, mais peuvent ĂȘtre autorisĂ©es en fournissant cette option sur la ligne de commande. Ceci n’affecte actuellement que les commandesexport-marks
,import-marks
, etimport-marks-if-exists
.N'activez cette option que si vous faites confiance au programme qui génÚre le flux d'importation rapide ! Cette option est activée automatiquement pour les assistants à distance qui utilisent la capacité `import`, car ils sont déjà autorisés à exécuter leur propre code.
Options pour les frontaux
- --cat-blob-fd=<df>
-
Ăcrire les rĂ©ponses aux requĂȘtes
get-mark
,cat-blob
, etls
dans le descripteur de fichier <df> au lieu destdout
. Permet Ă la sortieprogress
destinĂ©e Ă l’utilisateur final d’ĂȘtre sĂ©parĂ©e des autres sorties. - --date-format=<fmt>
-
SpĂ©cifier le type de dates que le frontal fournira Ă l’importation rapide dans les commandes
author
,committer
ettagger
. Voir « Formats » de date" ci-dessous pour plus de détails sur les formats pris en charge et leur syntaxe. - --done
-
Terminer avec une erreur s’il n’y a pas de commande
done
Ă la fin du flux. Cette option peut ĂȘtre utile pour dĂ©tecter les erreurs qui font que le frontal se termine avant d’avoir commencĂ© Ă Ă©crire un flux.
Emplacement des fichiers de marques
- --export-marks=<fichier>
-
Décharger la table interne des marques dans un fichier, une fois terminé. Les marques sont écrites une par ligne comme
:markid SHA-1
. Les frontaux peuvent utiliser ce fichier pour valider les importations aprĂšs qu’elles aient Ă©tĂ© complĂ©tĂ©es, ou pour sauvegarder la table des marques Ă travers des exĂ©cutions incrĂ©mentales. Comme <fichier> n’est ouvert et tronquĂ© qu’au point de contrĂŽle (ou Ă la fin de l’opĂ©ration), le mĂȘme chemin peut aussi ĂȘtre donnĂ© sans risque Ă --import-marks. - --import-marks=<fichier>
-
Avant de traiter toute entrĂ©e, charger les marques spĂ©cifiĂ©es dans <fichier> Le fichier d’entrĂ©e doit exister, doit ĂȘtre lisible, et doit utiliser le mĂȘme format que celui produit par --export-marks. Plusieurs options peuvent ĂȘtre fournies pour importer plus d’un ensemble de marques. Si une marque est dĂ©finie Ă des valeurs diffĂ©rentes, le dernier fichier l’emporte.
- --import-marks-if-exists=<fichier>
-
Comme --import-marks mais au lieu de faire une erreur, ignore silencieusement le fichier sâil nâexiste pas.
- --[no-]relative-marks
-
AprĂšs avoir spĂ©cifiĂ© --relative-marks, les chemins spĂ©cifiĂ©s avec --import-marks= et --export-marks= sont relatifs Ă un rĂ©pertoire interne du dĂ©pĂŽt actuel. Dans git-fast-import, cela signifie que les chemins sont relatifs au rĂ©pertoire .git/info/fast-import. Cependant, d’autres importateurs peuvent utiliser un emplacement diffĂ©rent.
Les marques relatives et non relatives peuvent ĂȘtre combinĂ©es en entremĂȘlant --(no-)-relative-marks avec les options --(import|export)-marks=.
RĂ©Ă©criture de sous-module
- --rewrite-submodules-from=<nom>:<fichier>
- --rewrite-submodules-to=<nom>:<fichier>
-
RĂ©Ă©crire les identifiants d’objets pour le sous-module spĂ©cifiĂ© par <nom> Ă partir des valeurs utilisĂ©es dans le fichier source (from) <fichier> vers celles utilisĂ©es dans le fichier cible (to) <fichier>. Les marques from devraient avoir Ă©tĂ© crĂ©Ă©es par
git fast-export
, et les marques cibles devraient avoir été créées pargit fast-import
lors de l’importation de ce mĂȘme sous-module.<nom> peut ĂȘtre toute chaĂźne arbitraire ne contenant pas de caractĂšre deux-points, mais la mĂȘme valeur doit ĂȘtre utilisĂ©e avec les deux options lors de la spĂ©cification des marques correspondantes. Plusieurs sous-modules peuvent ĂȘtre spĂ©cifiĂ©s avec des valeurs diffĂ©rentes pour <nom>. C’est une erreur de ne pas utiliser ces options dans les paires correspondantes.
Ces options sont principalement utiles lors de la conversion d’un dĂ©pĂŽt d’un algorithme de hachage Ă un autre ; sans elles, fast-import Ă©chouera s’il rencontre un sous-module car il n’a aucun moyen d’Ă©crire l’ID de l’objet dans le nouvel algorithme de hachage.
RĂ©glage des performances et de la compression
- --active-branches=<n>
-
Nombre maximal de branches Ă maintenir actives en mĂȘme temps. Voir "Utilisation de la mĂ©moire'' ci-dessous pour plus de dĂ©tails. La valeur par dĂ©faut est 5.
- --big-file-threshold=<n>
-
Taille maximale d’un blob pour lequel fast-import tentera de crĂ©er un delta, exprimĂ©e en octets. La valeur par dĂ©faut est 512m (512 MiO). Certains importateurs peuvent souhaiter rĂ©duire cette valeur sur les systĂšmes dont la mĂ©moire est limitĂ©e.
- --depth=<n>
-
Profondeur delta maximale, pour la deltification des blobs et des arbres. La valeur par défaut est 50.
- --export-pack-edges=<fichier>
-
AprĂšs la crĂ©ation d’un fichier paquet, ajouter une ligne de donnĂ©es dans <fichier> listant le nom de fichier du fichier paquet et le dernier commit sur chaque branche qui a Ă©tĂ© Ă©crit dans ce fichier paquet. Ces informations peuvent ĂȘtre utiles aprĂšs l’importation de projets dont le jeu d’objets total dĂ©passe la limite de 4 GiO du fichier de paquet, car ces commits peuvent ĂȘtre utilisĂ©s comme points de bord pendant les appels Ă git pack-objects.
- --max-pack-size=<n>
-
Taille maximale de chaque fichier paquet de sortie. La valeur par défaut est illimitée.
- fastimport.unpackLimit
-
Voir git-config[1]
PERFORMANCE
La conception de fast-import lui permet dâimporter de grands projets dans un minimum dâutilisation de la mĂ©moire et de temps de traitement. En supposant que le frontal est capable de suivre fast-import et de lui fournir un flux constant de donnĂ©es, les importations pour les projets contenant plus de 10 ans dâhistoire et contenant plus de 100 000 commits individuels sont gĂ©nĂ©ralement rĂ©alisĂ©es en seulement 1 Ă 2 heures sur du matĂ©riel assez modeste (~ 2 000 USD).
La plupart des goulets d’Ă©tranglement semblent se situer au niveau de l’accĂšs aux donnĂ©es de la source Ă©trangĂšre (la source ne peut tout simplement pas extraire les rĂ©visions assez rapidement) ou de l’E/S du disque (l’importation rapide Ă©crit aussi vite que le disque peut prendre les donnĂ©es). Les importations s’exĂ©cuteront plus rapidement si les donnĂ©es sources sont stockĂ©es sur un lecteur diffĂ©rent de celui du dĂ©pĂŽt Git de destination (en raison d’une moindre contention des entrĂ©es/sorties).
COĂT DE DĂVELOPPEMENT
Un frontal typique pour l’importation rapide a tendance Ă peser environ 200 lignes de code Perl/Python/Ruby. La plupart des dĂ©veloppeurs ont pu crĂ©er des importateurs fonctionnels en quelques heures seulement, mĂȘme s’il s’agit de leur premiĂšre exposition Ă l’importation rapide, et parfois mĂȘme Ă Git. C’est une situation idĂ©ale, Ă©tant donnĂ© que la plupart des outils de conversion sont jetables (Ă utiliser une fois, et ne jamais regarder en arriĂšre).
FONCTIONNEMENT EN PARALLĂLE
Comme pour git push ou git fetch, les importations gĂ©rĂ©es par fast-import peuvent ĂȘtre exĂ©cutĂ©es en toute sĂ©curitĂ© parallĂšlement Ă des invocations parallĂšles de git repack -a -d
ou git gc
, ou à toute autre opération Git (y compris git prune , car les objets libres ne sont jamais utilisés par fast-import).
fast-import ne verrouille pas les refs de branches ou d’Ă©tiquettes qu’il est en train d’importer. AprĂšs l’importation, pendant sa phase de mise Ă jour des rĂ©fĂ©rences, fast-import teste chaque rĂ©fĂ©rence de branche existante pour vĂ©rifier que la mise Ă jour sera une mise Ă jour en avance rapide (le commit stockĂ© dans la rĂ©fĂ©rence est contenu dans le nouvel historique du commit Ă Ă©crire). Si la mise Ă jour n’est pas une mise Ă jour en avance rapide, fast-import ne mettra pas Ă jour cette rĂ©fĂ©rence et affichera un message d’avertissement. fast-import essaiera toujours de mettre Ă jour toutes les rĂ©fĂ©rences de branche, et ne s’arrĂȘtera pas au premier Ă©chec.
Les mises Ă jour de branche peuvent ĂȘtre forcĂ©es avec --force, mais il est recommandĂ© de ne l’utiliser que sur un dĂ©pĂŽt autrement calme. L’utilisation de --force n’est pas nĂ©cessaire pour une importation initiale dans un dĂ©pĂŽt vide.
DISCUSSION TECHNIQUE
fast-import suit un ensemble de branches en mĂ©moire. Chaque branche peut ĂȘtre crĂ©Ă©e ou modifiĂ©e Ă tout moment pendant le processus d’importation en envoyant une commande commit
sur le flux d’entrĂ©e. Cette conception permet Ă un programme frontal de traiter un nombre illimitĂ© de branches simultanĂ©ment, en gĂ©nĂ©rant des commits dans l’ordre oĂč ils sont disponibles dans les donnĂ©es sources. Elle simplifie aussi considĂ©rablement les programmes frontaux.
fast-import n’utilise pas et ne modifie pas le rĂ©pertoire de travail actuel, ni aucun fichier qui s’y trouve. (Il met cependant Ă jour le dĂ©pĂŽt Git actuel, comme rĂ©fĂ©rencĂ© par GIT_DIR
). Par consĂ©quent, un frontal d’importation peut utiliser le rĂ©pertoire de travail pour ses propres besoins, comme l’extraction des rĂ©visions de fichiers de la source Ă©trangĂšre. Cette ignorance du rĂ©pertoire de travail permet Ă©galement Ă fast-import de s’exĂ©cuter trĂšs rapidement, car il n’a pas besoin d’effectuer de coĂ»teuses opĂ©rations de mise Ă jour de fichiers lorsqu’il passe d’une branche Ă l’autre.
FORMAT D’ENTRĂE
Ă l’exception des donnĂ©es de fichiers brutes (que Git n’interprĂšte pas), le format d’entrĂ©e de l’importation rapide est basĂ© sur le texte (ASCII). Ce format texte simplifie le dĂ©veloppement et le dĂ©bogage des programmes frontaux, en particulier lorsqu’un langage de plus haut niveau tel que Perl, Python ou Ruby est utilisĂ©.
fast-import est trĂšs strict sur ses entrĂ©es. Lorsque nous disons SP ci-dessous, nous voulons dire exactement un espace. De mĂȘme, LF signifie un (et un seul) saut de ligne et HT une (et une seule) tabulation horizontale. Fournir des caractĂšres d’espacement supplĂ©mentaires provoquera des rĂ©sultats inattendus, tels que des noms de branches ou des noms de fichiers avec des espaces en tĂȘte ou en queue de liste dans leur nom, ou la fin prĂ©maturĂ©e de fast-import lorsqu’il rencontre une entrĂ©e inattendue.
Commentaires dans le flux
Pour aider à déboguer les frontaux, fast-import ignore toute ligne commençant par #
(ASCII diĂšse/hash) jusqu’Ă et y compris la ligne se terminant par LF
. Une ligne de commentaire peut contenir n’importe quelle sĂ©quence d’octets qui ne contient pas de LF et peut donc ĂȘtre utilisĂ©e pour inclure toute information de dĂ©bogage dĂ©taillĂ©e qui pourrait ĂȘtre spĂ©cifique au frontal et utile lors de l’inspection d’un flux de donnĂ©es d’importation rapide.
Formats de date
Les formats de date suivants sont supportĂ©s. Un frontal doit sĂ©lectionner le format qu’il utilisera pour cette importation en passant le nom du format dans l’option de ligne de commande --date-format=<fmt>.
-
raw
-
Il s’agit du format natif de Git et correspond Ă
<temps>âŻ; SP <dĂ©calage utc>
. C’est Ă©galement le format par dĂ©faut de fast-import, si --date-format n’a pas Ă©tĂ© spĂ©cifiĂ©.L’heure de l’Ă©vĂ©nement est spĂ©cifiĂ©e par
<temps>
comme le nombre de secondes depuis l’Ă©poque UNIX (minuit, 1er janvier 1970, UTC) et est Ă©crite comme un entier dĂ©cimal ASCII.Le dĂ©calage local est spĂ©cifiĂ© par
<décalage utc>
comme un décalage positif ou négatif par rapport à UTC. Par exemple, EST (qui est 5 heures derriÚre UTC) sera exprimé en<tz>
par-0500'' alors que UTC est `
+0000''. Le dĂ©calage local n’affecte pas<temps>
il n’est utilisĂ© que comme une indication pour aider les routines de formatage Ă afficher l’horodatage.Si le dĂ©calage local n’est pas disponible dans le matĂ©riel source, utiliser “+0000”, ou le dĂ©calage local le plus courant. Par exemple, de nombreuses organisations ont un dĂ©pĂŽt CVS qui n’a jamais Ă©tĂ© consultĂ© que par des utilisateurs situĂ©s au mĂȘme endroit et dans le mĂȘme fuseau horaire. Dans ce cas, on peut infĂ©rer un dĂ©calage raisonnable par rapport Ă UTC.
Contrairement au format
rfc2822
, ce format est trĂšs strict. Toute variation dans le formatage entraĂźnera le rejet de la valeur par fast-import, et certains contrĂŽles d’intĂ©gritĂ© des valeurs numĂ©riques peuvent Ă©galement ĂȘtre effectuĂ©s. -
raw-permissive
-
C’est la mĂȘme chose que
raw
, sauf qu’aucun contrĂŽle d’authenticitĂ© sur l’Ă©poque numĂ©rique et le dĂ©calage local n’est effectuĂ©. Cela peut ĂȘtre utile lorsque vous essayez de filtrer ou d’importer un historique existant avec, par exemple, des valeurs de fuseau horaire erronĂ©es. -
rfc2822
-
C’est le standard de format de date tel que dĂ©crit par la RFC 2822.
Un exemple de valeur est “Tue Feb 6 11:22:18 2007 -0500”. L’analyseur syntaxique de Git est prĂ©cis, mais un peu trop indulgent. Il s’agit du mĂȘme analyseur que celui utilisĂ© par git am lors de l’application de rustines reçues par courrier Ă©lectronique.
Certaines chaĂźnes malformĂ©es peuvent ĂȘtre acceptĂ©es comme des dates valides. Dans certains de ces cas, Git sera toujours capable d’obtenir la date correcte Ă partir de la chaĂźne malformĂ©e. Il existe Ă©galement certains types de chaĂźnes malformĂ©es que Git analysera de maniĂšre erronĂ©e, tout en les considĂ©rant comme valides. Les chaĂźnes lourdement malformĂ©es seront rejetĂ©es.
Contrairement au format
raw
ci-dessus, les informations relatives au fuseau horaire et au dĂ©calage UTC contenues dans une chaĂźne de date RFC 2822 sont utilisĂ©es pour ajuster la valeur de la date Ă l’UTC avant le stockage. Il est donc important que ces informations soient aussi prĂ©cises que possible.Si le matĂ©riel source utilise des dates de type RFC 2822, le frontal devrait laisser fast-import gĂ©rer l’analyse et la conversion (plutĂŽt que d’essayer de le faire lui-mĂȘme) car l’analyseur de Git a Ă©tĂ© bien testĂ© sur le terrain.
Les frontends devraient préférer le format
raw
si le matĂ©riel source utilise dĂ©jĂ le format UNIX-epoch, si on peut l’amener Ă donner les dates dans ce format, ou si son format est facilement convertible en ce format, car il n’y a pas d’ambiguĂŻtĂ© dans l’analyse. -
now
-
Utiliser toujours l’heure et le fuseau horaire actuels. Le littĂ©ral
now
doit toujours ĂȘtre fourni pour<quand>
.Il s’agit d’un format jouet. L’heure et le fuseau horaire actuels de ce systĂšme sont toujours copiĂ©s dans la chaĂźne d’identitĂ© au moment oĂč elle est crĂ©Ă©e par fast-import. Il n’y a aucun moyen de spĂ©cifier une heure ou un fuseau horaire diffĂ©rent.
Ce format particulier est fourni car il est court Ă mettre en Ćuvre et peut ĂȘtre utile Ă un processus qui veut crĂ©er un nouveau commit tout de suite, sans avoir besoin d’utiliser un rĂ©pertoire de travail ou git update-index.
Si des commandes
author
etcommitter
distinctes sont utilisées dans uncommit
, les horodatages peuvent ne pas correspondre, car l’horloge du systĂšme sera interrogĂ©e deux fois (une fois pour chaque commande). La seule façon de s’assurer que les informations d’identitĂ© de l’auteur et du validateur ont le mĂȘme horodatage est d’omettreauthor
(en copiant donc Ă partir decommitter
) ou d’utiliser un format de date autre quenow
.
Commandes
fast-import accepte plusieurs commandes pour mettre Ă jour le dĂ©pĂŽt actuel et contrĂŽler le processus d’importation en cours. Une discussion plus dĂ©taillĂ©e (avec des exemples) de chaque commande suit plus bas.
-
commit
-
CrĂ©e une nouvelle branche ou met Ă jour une branche existante en crĂ©ant un nouveau commit et en mettant Ă jour la branche pour qu’elle pointe sur le commit nouvellement crĂ©Ă©.
-
tag
-
CrĂ©e un objet Ă©tiquette annotĂ© Ă partir d’un commit ou d’une branche existante. Les Ă©tiquettes lĂ©gĂšres ne sont pas prises en charge par cette commande, car elles ne sont pas recommandĂ©es pour enregistrer des points significatifs dans le temps.
-
reset
-
RĂ©initialise une branche existante (ou une nouvelle branche) Ă une rĂ©vision spĂ©cifique. Cette commande doit ĂȘtre utilisĂ©e pour changer une branche Ă une rĂ©vision spĂ©cifique sans faire un commit sur celle-ci.
-
blob
-
Convertit les données brutes du fichier en un blob, pour une utilisation future dans une commande
commit
. Cette commande est facultative et n’est pas nĂ©cessaire pour effectuer une importation. -
alias
-
Enregistrer qu’une marque se rĂ©fĂšre Ă un objet donnĂ© sans crĂ©er d’abord un nouvel objet. Utiliser --import-marks et se rĂ©fĂ©rer Ă des marques manquantes fera Ă©chouer l’importation rapide, donc les alias peuvent fournir un moyen de dĂ©finir des commits autrement Ă©laguĂ©s Ă une valeur valide (par exemple, l’ancĂȘtre non Ă©laguĂ© le plus proche).
-
checkpoint
-
Force fast-import Ă fermer le fichier paquet actuel, Ă gĂ©nĂ©rer sa somme de contrĂŽle SHA-1 unique et son index, et Ă dĂ©marrer un nouveau fichier paquet. Cette commande est facultative et n’est pas nĂ©cessaire pour effectuer une importation.
-
progress
-
Permet Ă fast-import de renvoyer la ligne entiĂšre vers sa propre sortie standard. Cette commande est facultative et n’est pas nĂ©cessaire pour effectuer une importation.
-
done
-
Marque la fin du flux. Cette commande est facultative, sauf si la fonctionnalité
done
a Ă©tĂ© demandĂ©e Ă l’aide de l’option de ligne de commande--done
ou de la commandefeature done
. -
get-mark
-
Demande Ă fast-import d’imprimer le SHA-1 correspondant Ă une marque sur le descripteur de fichier dĂ©fini avec
--cat-blob-fd
, oustdout
si non spécifié. -
cat-blob
-
Demande Ă fast-import d’imprimer un blob au format cat-file --batch sur le descripteur de fichier dĂ©fini avec
--cat-blob-fd
oustdout
si non spécifié. -
ls
-
Demande Ă fast-import d’afficher une ligne dĂ©crivant une entrĂ©e de rĂ©pertoire au format ls-tree sur le descripteur de fichier dĂ©fini avec
--cat-blob-fd
, oustdout
si non spécifié. -
feature
-
Active la fonctionnalitĂ© spĂ©cifiĂ©e. Pour cela, il faut que l’importation rapide prenne en charge la fonction spĂ©cifiĂ©e, sinon elle s’arrĂȘte.
-
option
-
SpĂ©cifier n’importe laquelle des options listĂ©es sous OPTIONS qui ne modifient pas la sĂ©mantique du flux pour rĂ©pondre aux besoins du frontend’s. Cette commande est facultative et n’est pas nĂ©cessaire pour effectuer une importation.
commit
Créer ou mettre à jour une branche avec un nouveau commit, en enregistrant une modification logique au projet.
'commit' SP <ref> LF mark? original-oid? ('author' (SP <nom>)? SP LT <email> GT SP <quand> LF)? 'committer' (SP <nom>)? SP LT <email> GT SP <quand> LF ('encoding' SP <encodage>)? data ('from' SP <commit-esque> LF)? ('merge' SP <commit-esque> LF)* (filemodify | filedelete | filecopy | filerename | filedeleteall | notemodify)* LF?
oĂč <ref>
est le nom de la branche sur laquelle le commit doit ĂȘtre effectuĂ©. Typiquement, les noms de branches sont prĂ©fixĂ©s par refs/heads/
dans Git, donc importer le symbole de branche CVS RELENG-1_0
utilisera refs/heads/RELENG-1_0
pour la valeur de <ref>
. La valeur de <ref>
doit ĂȘtre un nom de rĂ©fĂ©rence valide dans Git. Comme LF
n’est pas valide dans un nom de rĂ©fĂ©rence Git, aucune syntaxe de citation ou d’Ă©chappement n’est supportĂ©e ici.
Une commande mark
peut optionnellement apparaĂźtre, demandant Ă fast-import de sauvegarder une rĂ©fĂ©rence au commit nouvellement crĂ©Ă© pour une utilisation future par le frontal (voir ci-dessous pour le format). Il est trĂšs courant pour les frontaux de marquer chaque commit qu’ils crĂ©ent, permettant ainsi la crĂ©ation de branches futures Ă partir de n’importe quel commit importĂ©.
La commande data
qui suit committer
doit fournir le message de validation (voir ci-dessous la syntaxe de la commande data
). Pour importer un message de validation vide, utilisez des donnĂ©es de longueur 0. Les messages de validation sont de forme libre et ne sont pas interprĂ©tĂ©s par Git. Actuellement, ils doivent ĂȘtre encodĂ©s en UTF-8, car fast-import ne permet pas de spĂ©cifier d’autres encodages.
Une ou plusieurs commandes filemodify
, filedelete
, filecopy
, filerename
, filedeleteall
et notemodify
peuvent ĂȘtre incluses pour mettre Ă jour le contenu de la branche avant de crĂ©er le commit. Ces commandes peuvent ĂȘtre fournies dans n’importe quel ordre. Cependant, il est recommandĂ© que la commande filedeleteall
précÚde toutes les commandes filemodify
, filecopy
, filerename
et notemodify
dans le mĂȘme commit, car filedeleteall
efface la branche (voir ci-dessous).
Le LF
aprÚs la commande est facultatif (il était auparavant obligatoire). Notez que pour des raisons de compatibilité ascendante, si le commit se termine par une commande data
(c’est-Ă -dire qu’il n’y a pas de commande from
, merge
, filemodify
, filedelete
, filecopy
, fileename
, filedeleteall
ou notemodify
), alors deux commandes LF
peuvent apparaĂźtre Ă la fin de la commande au lieu d’une seule.
author
Une commande author
peut optionnellement apparaĂźtre, si les informations de l’auteur peuvent diffĂ©rer de celles du validateur. Si author
est omis, alors fast-import utilisera automatiquement les informations du validateur pour la partie auteur du commit. Voir ci-dessous pour une description des champs de author
, car ils sont identiques Ă ceux de committer
.
committer
La commande committer
indique qui a fait ce commit, et quand il l’a fait.
Ici, <om>
est le nom d’affichage de la personne' (par exemple “Com M Itter”) et <email>
est l’adresse Ă©lectronique de la personne (“cm@example.com”). LT
et GT
sont les symboles littĂ©raux moins que (\x3c) et plus que (\x3e). Ils sont nĂ©cessaires pour dĂ©limiter l’adresse Ă©lectronique des autres champs de la ligne. Notez que <nom>
et <email>
sont de forme libre et peuvent contenir n’importe quelle sĂ©quence d’octets, sauf LT
, GT
et LF
. Le nom est généralement codé en UTF-8.
L’heure de la modification est spĂ©cifiĂ©e par <quand>
en utilisant le format de date qui a Ă©tĂ© sĂ©lectionnĂ© par l’option de ligne de commande --date-format=<fmt>. Voir "Formats de date'' ci-dessus pour l’ensemble des formats pris en charge et leur syntaxe.
encoding
La commande optionnelle encoding
indique l’encodage du message de validation. La plupart des commits sont UTF-8 et l’encodage est omis, mais cela permet d’importer des messages de commit dans git sans les rĂ©-encoder au prĂ©alable.
from
La commande from
est utilisĂ©e pour spĂ©cifier le commit Ă partir duquel initialiser cette branche. Cette rĂ©vision sera le premier ancĂȘtre du nouveau commit. L’Ă©tat de l’arbre construit Ă partir de ce commit commencera avec l’Ă©tat du commit from
, et sera modifié par les modifications de contenu de ce commit.
Omettre la commande from
dans le premier commit d’une nouvelle branche fera que fast-import crĂ©era ce commit sans ancĂȘtre. Ceci n’est gĂ©nĂ©ralement souhaitĂ© que pour le premier commit d’un projet. Si le frontal crĂ©e tous les fichiers Ă partir de zĂ©ro lors de la crĂ©ation d’une nouvelle branche, une commande merge
peut ĂȘtre utilisĂ©e Ă la place de from
pour commencer le commit avec un arbre vide. Omettre la commande from
sur des branches existantes est gĂ©nĂ©ralement souhaitable, car le commit actuel sur cette branche est automatiquement supposĂ© ĂȘtre le premier ancĂȘtre du nouveau commit.
Comme LF
n’est pas valide dans un refname Git ou une expression SHA-1, aucune syntaxe de citation ou d’Ă©chappement n’est supportĂ©e dans <commit-esque>
.
Ici, <commit-esque>
est l’un des Ă©lĂ©ments suivants :
-
Le nom d’une branche existante dĂ©jĂ dans la table interne des branches de fast-import. Si fast-import ne connaĂźt pas le nom, il est traitĂ© comme une expression SHA-1.
-
Une référence de marque,
:<idnum>
, oĂč<idnum>
est le numéro de la marque.La raison pour laquelle fast-import utilise
:
pour indiquer une rĂ©fĂ©rence de marque est que ce caractĂšre n’est pas lĂ©gal dans un nom de branche Git. Le caractĂšre de tĂȘte:
permet de distinguer facilement la marque 42 (:42
) de la branche 42 (42
ourefs/heads/42
), ou d’un SHA-1 abrĂ©gĂ© qui n’est constituĂ© que de chiffres en base 10.Les marques doivent ĂȘtre dĂ©clarĂ©es (via
mark
) avant de pouvoir ĂȘtre utilisĂ©es. -
Un commit SHA-1 complet de 40 octets ou abrégé en hexadécimal.
-
Toute expression SHA-1 valide de Git qui se rĂ©sout en un commit. Voir "SPĂCIFICATION DE RĂVISIONS'' in gitrevisions[7] pour plus de dĂ©tails.
-
Le SHA-1 spĂ©cial nul (40 zĂ©ros) indique que la branche doit ĂȘtre supprimĂ©e.
Le cas particulier de la reprise d’une importation incrĂ©mentale Ă partir de la valeur actuelle de la branche doit ĂȘtre Ă©crit comme suit :
from refs/heads/branch^0
Le suffixe ^0
est nĂ©cessaire car fast-import ne permet pas Ă une branche de dĂ©marrer Ă partir d’elle-mĂȘme, et la branche est crĂ©Ă©e en mĂ©moire avant mĂȘme que la commande from
ne soit lue en entrĂ©e. L’ajout de ^0
forcera fast-import Ă rĂ©soudre le commit Ă travers la bibliothĂšque d’analyse de rĂ©vision de Git’s, plutĂŽt que sa table de branche interne, chargeant ainsi la valeur existante de la branche.
merge
Inclut un commit d’ancĂȘtre supplĂ©mentaire. Le lien d’ancĂȘtre supplĂ©mentaire ne change pas la façon dont l’Ă©tat de l’arbre est construit Ă ce commit. Si la commande from
est omise lors de la crĂ©ation d’une nouvelle branche, le premier commit merge
sera le premier ancĂȘtre du commit actuel, et la branche commencera sans fichier. Un nombre illimitĂ© de commandes merge
par commit est autorisé par fast-import, établissant ainsi une fusion à n voies.
Ici, <commit-esque>
est l’une des expressions de spĂ©cification de commit Ă©galement acceptĂ©es par from
(voir ci-dessus).
filemodify
Inclus dans une commande commit
pour ajouter un nouveau fichier ou modifier le contenu d’un fichier existant. Cette commande a deux moyens diffĂ©rents de spĂ©cifier le contenu du fichier.
- Format externe de données
-
Le contenu des données pour le fichier a déjà été fourni par une commande
blob
antérieure. Le frontal a juste besoin de le connecter.'M' SP <mode> SP <ref-données> SP <chemin> LF
Ici, généralement,
<ref-données>
doit ĂȘtre soit une rĂ©fĂ©rence de marque (:<idnum>
) définie par une commandeblob
antĂ©rieure, soit un SHA-1 complet de 40 octets d’un objet blob Git existant. Si<mode>
est040000`
, alors<ref-données>
doit ĂȘtre le SHA-1 complet sur 40 octets d’un objet arbre Git existant ou une rĂ©fĂ©rence de marque dĂ©finie avec--import-marks
. - Format en ligne de données
-
Le contenu des donnĂ©es du fichier n’a pas encore Ă©tĂ© fourni. Le frontal veut le fournir dans le cadre de cette commande de modification.
'M' SP <mode> SP 'inline' SP <chemin> LF données
Voir ci-dessous pour une description détaillée de la commande
data
.
Dans les deux formats, <mode>
est le type d’entrĂ©e du fichier, spĂ©cifiĂ© en octal. Git ne supporte que les modes suivantsâŻ:
-
100644
ou644
âŻ: Un fichier normal (non exĂ©cutable). La majoritĂ© des fichiers dans la plupart des projets utilisent ce mode. En cas de doute, c’est ce que vous voulez. -
100755
ou755
: Un fichier normal, mais exécutable. -
120000
: Un lien symbolique, le contenu du fichier sera la cible du lien. -
160000
: Un lien git, SHA-1 de l’objet fait rĂ©fĂ©rence Ă un commit dans un autre dĂ©pĂŽt. Les liens Git ne peuvent ĂȘtre spĂ©cifiĂ©s que par SHA ou par une marque de commit. Ils sont utilisĂ©s pour implĂ©menter des sous-modules. -
040000
âŻ: Un sous-rĂ©pertoire. Les sous-rĂ©pertoires ne peuvent ĂȘtre spĂ©cifiĂ©s que par SHA ou par une marque d’arbre dĂ©finie avec--import-marks
.
Dans les deux formats, <chemin>
est le chemin complet du fichier Ă ajouter (s’il n’existe pas dĂ©jĂ ) ou Ă modifier (s’il existe dĂ©jĂ ).
A <path>
can be written as unquoted bytes or a C-style quoted string.
When a <path>
does not start with a double quote ("
), it is an unquoted string and is parsed as literal bytes without any escape sequences. However, if the filename contains LF
or starts with double quote, it cannot be represented as an unquoted string and must be quoted. Additionally, the source <path>
in filecopy
or filerename
must be quoted if it contains SP.
When a <path>
starts with a double quote ("
), it is a C-style quoted string, where the complete filename is enclosed in a pair of double quotes and escape sequences are used. Certain characters must be escaped by preceding them with a backslash: LF
is written as \n
, backslash as \\
, and double quote as \"
. Some characters may optionally be written with escape sequences: \a
for bell, \b
for backspace, \f
for form feed, \n
for line feed, \r
for carriage return, \t
for horizontal tab, and \v
for vertical tab. Any byte can be written with 3-digit octal codes (e.g., \033
). All filenames can be represented as quoted strings.
Un <chemin>
doit utiliser des séparateurs de répertoire de style UNIX (barre oblique /
) et sa valeur doit ĂȘtre de forme canonique, en ce qu’il ne doit pasâŻ:
-
contenir un composant de répertoire vide (par exemple,
foo//bar
n’est pas valide), -
se terminer par un séparateur de répertoire (par exemple,
foo/
n’est pas valide), -
commencer par un séparateur de répertoire (par exemple,
/foo
n’est pas valide), -
contenir le composant spécial
.
ou..
(par exemple,foo/./bar
etfoo/../bar
sont invalides).
La racine de l’arbre peut ĂȘtre reprĂ©sentĂ©e par une chaĂźne vide comme <chemin>
.
<chemin>
ne peut pas contenir de caractÚre NUL, ni littéralement ni échappé comme dans \000
.Il est recommandé que <chemin>
soit toujours encodé en UTF-8.
filedelete
Inclus dans une commande commit
pour supprimer un fichier ou supprimer rĂ©cursivement un rĂ©pertoire entier de la branche. Si la suppression du fichier ou du rĂ©pertoire rend son rĂ©pertoire parent vide, le rĂ©pertoire parent sera automatiquement supprimĂ© aussi. Cela se fait en cascade dans l’arbre jusqu’Ă ce que le premier rĂ©pertoire non vide ou la racine soit atteint.
'D' SP <chemin> LF
oĂč <chemin>
est le chemin complet du fichier ou du sous-répertoire à supprimer de la branche. Voir filemodify
ci-dessus pour une description détaillée de <chemin>
.
filecopy
Copie récursivement un fichier ou un sous-répertoire existant à un emplacement différent dans la branche. Le fichier ou le répertoire existant doit exister. Si la destination existe, elle sera complÚtement remplacée par le contenu copié depuis la source.
'C' SP <chemin> SP <chemin> LF
ici le premier <chemin>
est l’emplacement source et le second <chemin>
est la destination. Voir filemodify
ci-dessus pour une description détaillée de ce à quoi <chemin>
peut ressembler. Pour utiliser un chemin source qui contient SP, le chemin doit ĂȘtre citĂ©.
Une commande filecopy
prend effet immĂ©diatement. Une fois que l’emplacement source a Ă©tĂ© copiĂ© vers la destination, toute commande future appliquĂ©e Ă l’emplacement source n’aura pas d’impact sur la destination de la copie.
filerename
Renomme un fichier ou un sous-répertoire existant à un emplacement différent dans la branche. Le fichier ou le répertoire existant doit exister. Si la destination existe, elle sera remplacée par le répertoire source.
'R' SP <chemin> SP <chemin> LF
ici le premier <chemin>
est l’emplacement source et le second <chemin>
est la destination. Voir filemodify
ci-dessus pour une description détaillée de ce à quoi <chemin>
peut ressembler. Pour utiliser un chemin source qui contient SP, le chemin doit ĂȘtre citĂ©.
Une commande filerename
prend effet immĂ©diatement. Une fois que l’emplacement source a Ă©tĂ© renommĂ© vers la destination, toute commande future appliquĂ©e Ă l’emplacement source crĂ©era de nouveaux fichiers Ă cet endroit et n’aura pas d’impact sur la destination du renommage.
Notez qu’un filerename
est identique Ă un filecopy
suivi d’un filedelete
de l’emplacement source. Il y a un lĂ©ger avantage de performance Ă utiliser filerename
, mais l’avantage est si faible que cela ne vaut jamais la peine d’essayer de convertir une paire delete/add dans le matĂ©riel source en un renommage pour l’importation rapide. Cette commande filerename
est fournie juste pour simplifier les frontaux qui ont dĂ©jĂ des informations de renommage et ne veulent pas s’embĂȘter Ă les dĂ©composer en un filecopy
suivi d’un filedelete
.
filedeleteall
Inclus dans une commande commit
pour supprimer tous les fichiers (et aussi tous les rĂ©pertoires) de la branche. Cette commande rĂ©initialise la structure interne de la branche pour qu’elle ne contienne aucun fichier, ce qui permet Ă l’interface d’ajouter ultĂ©rieurement tous les fichiers intĂ©ressants Ă partir de zĂ©ro.
'deleteall' LF
Cette commande est extrĂȘmement utile si le frontal ne sait pas (ou ne se soucie pas de savoir) quels fichiers sont actuellement sur la branche, et ne peut donc pas gĂ©nĂ©rer les commandes filedelete
appropriées pour mettre à jour le contenu.
L’envoi d’une commande filedeleteall
suivie des commandes filemodify
nĂ©cessaires pour dĂ©finir le contenu correct produira les mĂȘmes rĂ©sultats que l’envoi des commandes filemodify
et filedelete
nĂ©cessaires. L’approche filedeleteall
peut cependant demander Ă fast-import d’utiliser un peu plus de mĂ©moire par branche active (moins de 1 MiB pour la plupart des gros projets)âŻ; donc les frontaux qui peuvent facilement obtenir seulement les chemins affectĂ©s pour un commit sont encouragĂ©s Ă le faire.
notemodify
Inclus dans une commande commit
<réf-notes>
pour ajouter une nouvelle note annotant un <commit-esque>
ou changer le contenu de cette annotation. En interne, c’est similaire Ă filemodify 100644 sur le chemin <commit-esque>
(peut-ĂȘtre divisĂ© en sous-rĂ©pertoires). Il n’est pas conseillĂ© d’utiliser d’autres commandes pour Ă©crire dans l’arbre <rĂ©f-notes>
sauf filedeleteall
pour supprimer toutes les notes existantes dans cet arbre. Cette commande a deux moyens différents de spécifier le contenu de la note.
- Format externe de données
-
Le contenu des données pour la note a déjà été fourni par une commande
blob
antĂ©rieure. Le frontal a juste besoin de le connecter au commit qui doit ĂȘtre annotĂ©.'N' SP <rĂ©f-data> SP <commit-esque> LF
Ici,
<réf-data>
peut ĂȘtre soit une rĂ©fĂ©rence de marque (:<idnum>
) définie par une commandeblob
antĂ©rieure, soit un SHA-1 complet de 40 octets d’un objet blob Git existant. - Format en ligne de donnĂ©es
-
Le contenu des donnĂ©es de la note n’a pas encore Ă©tĂ© fourni. Le frontal veut le fournir dans le cadre de cette commande de modification.
'N' SP 'inline' SP <commit-esque> LF data
Voir ci-dessous pour une description détaillée de la commande
data
.
Dans les deux formats, <commit-esque>
est l’une des expressions de spĂ©cification de commit Ă©galement acceptĂ©es par from
(voir ci-dessus).
mark
Fait en sorte que l’import rapide sauvegarde une rĂ©fĂ©rence Ă l’objet courant, permettant au frontal de rappeler cet objet Ă un moment ultĂ©rieur, sans connaĂźtre son SHA-1. Ici, l’objet courant est la commande de crĂ©ation d’objet dans laquelle la commande mark
apparaĂźt. Cela peut ĂȘtre commit
, tag
, et blob
, mais commit
est l’usage le plus courant.
'mark' ; SP ':' ; <idnum> ; LF
oĂč <idnum>
est le numéro attribué par le frontal à cette marque. La valeur de <idnum>
est exprimĂ©e sous la forme d’un nombre entier dĂ©cimal ASCII. La valeur 0 est rĂ©servĂ©e et ne peut pas ĂȘtre utilisĂ©e comme marque. Seules les valeurs supĂ©rieures ou Ă©gales Ă 1 peuvent ĂȘtre utilisĂ©es comme marques.
Les nouvelles marques sont crĂ©Ă©es automatiquement. Les marques existantes peuvent ĂȘtre dĂ©placĂ©es vers un autre objet simplement en rĂ©utilisant le mĂȘme <idnum>
dans une autre commande mark
.
original-oid
Fournit le nom de l’objet dans le systĂšme de contrĂŽle de la source d’origine. fast-import ignorera simplement cette directive, mais les processus de filtrage qui opĂšrent et modifient le flux avant de l’envoyer Ă fast-import peuvent avoir besoin de cette information
'original-oid' ; SP <identifiant-objet> ; LF
oĂč <identifiant-objet>
est une chaĂźne quelconque ne contenant pas LF.
tag
Crée une étiquette annotée faisant référence à un commit spécifique. Pour créer des étiquettes légÚres (non annotés), voir la commande reset
ci-dessous.
'tag' SP <nom> LF mark? 'from' SP <commit-esque> LF original-oid? 'tagger' (SP <nom>)? SP LT <email> GT SP <quand> LF <data>
oĂč <nom>
est le nom de l’Ă©tiquette Ă crĂ©er.
Les noms des étiquettes sont automatiquement préfixés par refs/tags/
lorsqu’elles sont stockĂ©s dans Git, ainsi l’importation du symbole de branche CVS RELENG-1_0-FINAL
utilisera juste RELENG-1_0-FINAL
pour <nom>
, et fast-import écrira la référence correspondante comme refs/tags/RELENG-1_0-FINAL
.
La valeur de <nom>
doit ĂȘtre un nom de rĂ©fĂ©rence valide dans Git et peut donc contenir des barres obliques. Comme LF
n’est pas valide dans un nom de rĂ©fĂ©rence Git, aucune syntaxe de citation ou d’Ă©chappement n’est supportĂ©e ici.
La commande from
est la mĂȘme que pour la commande commit
; voir ci-dessus pour plus de détails.
La commande tagger
utilise le mĂȘme format que committer
dans commit
; encore une fois, voir ci-dessus pour les détails.
La commande data
qui suit tagger
doit fournir le message d’Ă©tiquette annotĂ©e (voir ci-dessous pour la syntaxe de la commande data
). Pour importer un message vide, utilisez des donnĂ©es de longueur 0. Les messages d’Ă©tiquette sont de forme libre et ne sont pas interprĂ©tĂ©s par Git. Actuellement, ils doivent ĂȘtre encodĂ©s en UTF-8, car fast-import ne permet pas de spĂ©cifier d’autres encodages.
La signature des Ă©tiquettes annotĂ©es pendant l’importation Ă partir de fast-import n’est pas prise en charge. Essayer d’inclure votre propre signature PGP/GPG n’est pas recommandĂ©, car le frontal n’a pas (facilement) accĂšs Ă l’ensemble des octets qui composent normalement une telle signature. Si la signature est nĂ©cessaire, crĂ©ez des Ă©tiquettes lĂ©gĂšres depuis fast-import avec reset
, puis créez les versions annotées de ces étiquettes hors ligne avec le processus standard git tag.
reset
CrĂ©e (ou recrĂ©e) la branche nommĂ©e, en partant Ă©ventuellement d’une rĂ©vision spĂ©cifique. La commande reset permet Ă un frontal d’Ă©mettre une nouvelle commande from
pour une branche existante, ou de crĂ©er une nouvelle branche Ă partir d’un commit existant sans crĂ©er un nouveau commit.
'reset' SP <ref> LF ('from' SP <commit-esque> LF)? LF?
Pour une description détaillée de <ref>
et <commit-esque>
voir ci-dessus sous commit
et from
.
Le LF
aprĂšs la commande est facultatif (il Ă©tait auparavant obligatoire).
La commande reset
peut Ă©galement ĂȘtre utilisĂ©e pour crĂ©er des Ă©tiquettes lĂ©gĂšres (non annotĂ©es). Par exempleâŻ:
reset refs/tags/938 from :938
crĂ©erait l’Ă©tiquette lĂ©gĂšre refs/tags/938
faisant référence à la marque de commit :938
.
blob
Demande l’Ă©criture d’une rĂ©vision de fichier dans le fichier paquet. La rĂ©vision n’est connectĂ©e Ă aucun commitâŻ; cette connexion doit ĂȘtre formĂ©e dans une commande commit
ultérieure en référençant le blob par une marque assignée.
'blob' LF marque? oid-original? data
La commande mark est optionnelle ici car certains frontaux ont choisi de gĂ©nĂ©rer eux-mĂȘmes le SHA-1 de Git pour le blob et de le transmettre directement Ă commit
. Cependant, cela reprĂ©sente gĂ©nĂ©ralement plus de travail que cela nâen vaut la peine, car les marques sont peu coĂ»teuses Ă stocker et faciles Ă utiliser.
data
Fournit des donnĂ©es brutes (Ă utiliser comme contenu de blob/fichier, messages de commit ou messages de tags annotĂ©s) Ă fast-import. Les donnĂ©es peuvent ĂȘtre fournies en utilisant un nombre exact d’octets ou en Ă©tant dĂ©limitĂ©es par une ligne de fin. Les frontaux rĂ©els destinĂ©s Ă des conversions de qualitĂ© devraient toujours utiliser le format de comptage exact des octets, car il est plus robuste et plus performant. Le format dĂ©limitĂ© est principalement destinĂ© Ă tester l’importation rapide.
Les lignes de commentaires apparaissant dans la partie <brut>
des commandes data
sont toujours considĂ©rĂ©es comme faisant partie du corps des donnĂ©es et ne sont donc jamais ignorĂ©es par fast-import. Cela permet d’importer en toute sĂ©curitĂ© tout contenu de fichier/message dont les lignes pourraient commencer par #
.
- Format exact de comptage des octets
-
Le frontal doit spĂ©cifier le nombre d’octets de donnĂ©es.
'data' SP <compte> LF <brut> LF?
oĂč
<compte>
est le nombre exact d’octets apparaissant dans<brut>
. La valeur de<compte>
est exprimĂ©e sous la forme d’un nombre entier dĂ©cimal ASCII. Le "LF" de chaque cĂŽtĂ© de "brut" n’est pas inclus dans "compte" et ne sera pas inclus dans les donnĂ©es importĂ©es.Le
LF
aprĂšs<brut>
est facultatif (il Ă©tait auparavant obligatoire) mais recommandĂ©. Le fait de toujours l’inclure facilite le dĂ©bogage d’un flux d’importation rapide car la commande suivante commence toujours dans la colonne 0 de la ligne suivante, mĂȘme si<brut>
ne se termine pas par unLF
. - Format délimité
-
Une chaĂźne de dĂ©limitation est utilisĂ©e pour marquer la fin des donnĂ©es. fast-import calculera la longueur en recherchant le dĂ©limiteur. Ce format est principalement utile pour les tests et n’est pas recommandĂ© pour les donnĂ©es rĂ©elles.
'data' SP '<<' <delim> LF <brut> LF <delim> LF LF?
oĂč
<delim>
est la chaßne de délimitation choisie. La chaßne<delim>
ne doit pas apparaĂźtre sur une ligne seule dans<brut>
, sinon fast-import pensera que les donnĂ©es se terminent plus tĂŽt qu’elles ne le font rĂ©ellement. LeLF
qui suit immédiatement<brut>
fait partie de<brut>
. C’est une des limites du format dĂ©limitĂ©, il est impossible de fournir un morceau de donnĂ©es qui n’a pas un LF comme dernier octet.Le
LF
aprĂšs<delim> LF
est facultatif (il Ă©tait auparavant obligatoire).
alias
Enregistrer qu’une marque se rĂ©fĂšre Ă un objet donnĂ© sans crĂ©er au prĂ©alable un nouvel objet.
'alias' LF marque 'to' SP <commit-esque> LF LF?
Pour une description détaillée de <commit-esque>
voir ci-dessus sous from
.
checkpoint
Force fast-import à fermer le fichier paquet en cours, à en commencer un nouveau, et à sauvegarder toutes les références, étiquettes et marques de la branche en cours.
'checkpoint' LF LF?
Notez que fast-import change automatiquement de fichier paquet lorsque le fichier paquet actuel atteint --max-pack-size, ou 4 Gio, la limite la plus petite Ă©tant retenue. Pendant un changement automatique de fichier paquet, fast-import ne met pas Ă jour les refs de branche, les Ă©tiquettes ou les marques.
Comme un checkpoint
peut nĂ©cessiter une quantitĂ© significative de temps CPU et d’entrĂ©es-sorties sur le disque (pour calculer la somme de contrĂŽle SHA-1 du paquet global, gĂ©nĂ©rer le fichier d’index correspondant, et mettre Ă jour les rĂ©fĂ©rences), il peut facilement prendre plusieurs minutes pour une seule commande checkpoint
.
Les frontaux peuvent choisir d’Ă©mettre des points de contrĂŽle lors d’importations extrĂȘmement importantes et longues, ou lorsqu’ils doivent permettre Ă un autre processus Git d’accĂ©der Ă une branche. Cependant, Ă©tant donnĂ© qu’un dĂ©pĂŽt Subversion de 30 Go peut ĂȘtre chargĂ© dans Git par le biais d’un import rapide en 3 heures environ, la mise en place de points de contrĂŽle explicites peut ne pas ĂȘtre nĂ©cessaire.
Le LF
aprĂšs la commande est facultatif (il Ă©tait auparavant obligatoire).
progress
Demande Ă fast-import d’afficher la ligne progress
entiĂšre sans modification sur son canal de sortie standard (descripteur de fichier 1) lorsque la commande est traitĂ©e Ă partir du flux d’entrĂ©e. La commande n’a par ailleurs aucun impact sur l’importation en cours, ni sur l’Ă©tat interne de fast-import’s.
'progress' SP <chaĂźne-libre> LF LF?
La partie <chaĂźne-libre>
de la commande peut contenir toute sĂ©quence d’octets ne contenant pas de LF
. Le LF
aprĂšs la commande est facultatif. Les appelants peuvent souhaiter traiter la sortie Ă l’aide d’un outil tel que sed pour supprimer la partie de tĂȘte de la ligne, par exempleâŻ:
frontal | git fast-import | sed 's/^progress //' ;
Placer une commande progress
immédiatement aprÚs un checkpoint
informera le lecteur quand le checkpoint
est terminĂ© et qu’il peut accĂ©der en toute sĂ©curitĂ© aux refs que l’import rapide a mis Ă jour.
get-mark
Demande Ă fast-import d’imprimer le SHA-1 correspondant Ă une marque vers stdout ou vers le descripteur de fichier prĂ©alablement arrangĂ© avec l’argument --cat-blob-fd
. Cette commande n’a pas d’impact sur l’importation en cours ; son but est de rĂ©cupĂ©rer les SHA-1 que les commits ultĂ©rieurs pourraient vouloir mentionner dans leurs messages de commit.
'get-mark' SP ':' <idnum> LF
Voir "Réponses aux commandes" ci-dessous pour plus de détails sur la façon de lire cette sortie en toute sécurité.
cat-blob
Demande Ă fast-import d’imprimer un blob sur un descripteur de fichier prĂ©alablement dĂ©fini avec l’argument --cat-blob-fd
. La commande n’a autrement aucun impact sur l’importation couranteâŻ; son but principal est de rĂ©cupĂ©rer les blobs qui peuvent ĂȘtre dans la mĂ©moire de fast-import mais non accessibles depuis le dĂ©pĂŽt cible.
'cat-blob' SP <réf-data> LF
Le <réf-data>
peut ĂȘtre soit une rĂ©fĂ©rence de marque (:<idnum>
) dĂ©finie prĂ©cĂ©demment, soit un SHA-1 complet de 40 octets d’un blob Git, prĂ©existant ou prĂȘt Ă ĂȘtre Ă©crit.
La sortie utilise le mĂȘme format que git cat-file --batch
:
<sha1> SP 'blob' SP <taille> LF <contenu> LF
Cette commande peut ĂȘtre utilisĂ©e lĂ oĂč une directive filemodify
peut apparaĂźtre, ce qui permet de l’utiliser au milieu d’un commit. Pour un filemodify
utilisant une directive inline, elle peut aussi apparaĂźtre juste avant la directive data
.
Voir "Réponses aux commandes" ci-dessous pour plus de détails sur la façon de lire cette sortie en toute sécurité.
ls
Affiche des informations sur l’objet Ă un chemin vers un descripteur de fichier prĂ©alablement arrangĂ© avec l’argument --cat-blob-fd
. Cela permet d’afficher un blob Ă partir du commit actif (avec cat-blob
) ou de copier un blob ou un arbre Ă partir d’un commit prĂ©cĂ©dent pour l’utiliser dans le commit actuel (avec filemodify
).
La commande ls
peut Ă©galement ĂȘtre utilisĂ©e lĂ oĂč une directive filemodify
peut apparaĂźtre, ce qui permet de l’utiliser au milieu d’un commit.
- Lecture de l’engagement actif
-
Cette forme ne peut ĂȘtre utilisĂ©e qu’au milieu d’un
commit
. Le chemin nomme une entrĂ©e de rĂ©pertoire dans le commit actif de fast-import. Le chemin doit ĂȘtre citĂ© dans ce cas.'ls' SP <chemin> LF
- Lecture d’un arbre nommĂ©
-
Le
<réf-data>
peut ĂȘtre une rĂ©fĂ©rence de marque (:<idnum>
) ou le SHA-1 complet sur 40 octets d’une Ă©tiquette Git, d’un commit ou d’un objet arbre, prĂ©existant ou en attente d’Ă©criture. Le chemin est relatif au niveau supĂ©rieur de l’arbre nommĂ© par<rĂ©f-data>
.'ls' SP <réf-data> SP <chemin> LF
Voir filemodify
ci-dessus pour une description détaillée de <chemin>
.
La sortie utilise le mĂȘme format que git ls-tree <arbre> -- <chemin>
:
<mode> SP ('blob' | 'tree' | 'commit') SP <réf-data> HT <chemin> LF
Le <rĂ©f-data> reprĂ©sente le blob, l’arbre ou l’objet commit au <chemin> et peut ĂȘtre utilisĂ© dans les commandes ultĂ©rieures get-mark, cat-blob, filemodify, ou ls.
S’il n’y a pas de fichier ou de sous-arbre Ă ce chemin, git fast-import signalera Ă la place
missing SP <chemin> LF
Voir "Réponses aux commandes" ci-dessous pour plus de détails sur la façon de lire cette sortie en toute sécurité.
feature
Exige que fast-import prenne en charge la fonctionnalitĂ© spĂ©cifiĂ©e, ou abandonne si ce n’est pas le cas.
'feature' SP <fonction> ('=' <argument>)? LF
La partie <fonction> de la commande peut ĂȘtre l’une des suivantes :
- data-format
- export-marks
- relative-marks
- no-relative-marks
- forcer
-
Agit comme si l’option de ligne de commande correspondante avec un
--
en tĂȘte Ă©tait passĂ©e sur la ligne de commande (voir OPTIONS, ci-dessus). - import-marks
- import-marks-if-exists
-
Comme --import-marks sauf sur deux points : premiĂšrement, une seule commande "feature import-marks" ou "feature import-marks-if-exists" est autorisĂ©e par flux ; deuxiĂšmement, une option de ligne de commande --import-marks= ou --import-marks-if-exists remplace n’importe laquelle de ces commandes "feature" dans le flux ; troisiĂšmement, "feature import-marks-if-exists" comme une option de ligne de commande correspondante saute silencieusement un fichier inexistant.
- get-mark
- cat-blob
- ls
-
Exige que le moteur prenne en charge la commande get-mark, cat-blob, ou ls respectivement. Les versions de fast-import ne supportant pas la commande spĂ©cifiĂ©e se termineront avec un message l’indiquant. Cela permet Ă l’importation de se terminer prĂ©maturĂ©ment avec un message clair, plutĂŽt que de perdre du temps au dĂ©but de l’importation avant que la commande non supportĂ©e ne soit dĂ©tectĂ©e.
- notes
-
Exiger que le moteur prenne en charge la sous-commande notemodify (N) de la commande commit. Les versions de fast-import ne prenant pas en charge les notes se termineront par un message l’indiquant.
- fait
-
Sortir en erreur si le flux se termine sans une commande done. Sans cette fonctionnalitĂ©, les erreurs provoquant la fin abrupte du frontal Ă un moment opportun du flux peuvent passer inaperçues. Cela peut se produire, par exemple, si un frontal d’importation meurt au milieu de l’opĂ©ration sans Ă©mettre de SIGTERM ou SIGKILL Ă son instance git fast-import subordonnĂ©e.
option
Traite l’option spĂ©cifiĂ©e afin que git fast-import se comporte d’une maniĂšre qui convient aux besoins du frontal Notez que les options spĂ©cifiĂ©es par le frontal sont remplacĂ©es par toutes les options que l’utilisateur peut spĂ©cifier Ă git fast-import lui-mĂȘme.
'option' SP <option> LF
La partie <option>
de la commande peut contenir n’importe quelle option listĂ©e dans la section OPTIONS qui ne change pas la sĂ©mantique de l’importation, sans le --
de tĂȘte et est traitĂ©e de la mĂȘme maniĂšre.
Les commandes d’option doivent ĂȘtre les premiĂšres commandes sur l’entrĂ©e (sans compter les commandes de fonctionnalitĂ©), donner une commande d’option aprĂšs une commande de non-option est une erreur.
Les options de ligne de commande suivantes modifient la sĂ©mantique de l’importation et ne peuvent donc pas ĂȘtre passĂ©es en tant qu’option :
-
data-format
-
import-marks
-
export-marks
-
cat-blob-fd
-
forcer
RĂPONSES AUX COMMANDES
Les nouveaux objets Ă©crits par fast-import ne sont pas disponibles immĂ©diatement. La plupart des commandes de fast-import n’ont pas d’effet visible avant le prochain checkpoint (ou completion). Le frontal peut envoyer des commandes pour remplir le tuyau dâentrĂ©e de fast-import sans se soucier de la rapiditĂ© avec laquelle elles prendront effet, ce qui amĂ©liore les performances en simplifiant la planification.
Pour certains frontaux, cependant, il est utile de pouvoir relire les donnĂ©es du dĂ©pĂŽt actuel au fur et Ă mesure de sa mise Ă jour (par exemple lorsque le matĂ©riel source dĂ©crit les objets en termes de correctifs Ă appliquer aux objets prĂ©cĂ©demment importĂ©s). Ceci peut ĂȘtre rĂ©alisĂ© en connectant le frontal et fast-import via des tuyaux bidirectionnelsâŻ:
mkfifo fast-import-output frontal <fast-import-output | git fast-import >fast-import-output
Un frontal configuré de cette façon peut utiliser les commandes progress
, get-mark
, ls
, et cat-blob
pour lire les informations de l’import en cours.
Pour Ă©viter les blocages, de tels frontaux doivent complĂštement consommer toute sortie en attente de progress
, ls
, get-mark
, et cat-blob
avant d’effectuer des Ă©critures dans fast-import qui pourraient bloquer.
RAPPORTS D’ACCIDENT
Si fast-import reçoit une entrĂ©e invalide, il se terminera avec un statut de sortie non nul et crĂ©era un rapport d’accident au niveau supĂ©rieur du dĂ©pĂŽt Git dans lequel il importait. Les rapports d’accident contiennent un instantanĂ© de l’Ă©tat interne de fast-import ainsi que les commandes les plus rĂ©centes qui ont conduit au crash.
Toutes les commandes rĂ©centes (y compris les commentaires de flux, les modifications de fichiers et les commandes de progression) sont affichĂ©es dans l’historique des commandes au sein du rapport de collision, mais les donnĂ©es de fichiers brutes et les messages de validation sont exclus du rapport de collision. Cette exclusion permet de gagner de l’espace dans le fichier de rapport et de rĂ©duire la quantitĂ© de mise en mĂ©moire tampon que l’importation rapide doit effectuer pendant l’exĂ©cution.
AprĂšs avoir Ă©crit un rapport de panne, fast-import fermera le fichier paquet actuel et exportera la table des marques. Cela permet au dĂ©veloppeur du frontal d’inspecter l’Ă©tat du dĂ©pĂŽt et de reprendre l’importation Ă partir du point oĂč elle s’est arrĂȘtĂ©e. Les branches et les Ă©tiquettes modifiĂ©es ne sont pas mises Ă jour lors d’un crash, car l’importation ne s’est pas terminĂ©e avec succĂšs. Les informations sur les branches et les Ă©tiquettes se trouvent dans le rapport d’accident et doivent ĂȘtre appliquĂ©es manuellement si la mise Ă jour est nĂ©cessaire.
Un exemple d’accident :
$ cat >in <<END_OF_INPUT # mon tout premier commit de test commit refs/heads/master committer Shawn O. Pearce <spearce> 19283 -0400 # Qui est ce type d'ailleurs ? data <<EOF C'est mon commit EOF M 644 inline .gitignore data <<EOF .gitignore EOF M 777 inline bob END_OF_INPUT
$ git fast-import <in fatal: Corrupt mode: M 777 inline bob fast-import: dumping crash report to .git/fast_import_crash_8434
$ cat .git/fast_import_crash_8434 fast-import crash report: fast-import process: 8434 parent process : 1391 at Sat Sep 1 00:58:12 2007
fatal: Corrupt mode: M 777 inline bob
Most Recent Commands Before Crash --------------------------------- # mon tout premier commit commit refs/heads/master committer Shawn O. Pearce <spearce> 19283 -0400 # Qui est ce gars d'ailleurs ? data <<EOF M 644 inline .gitignore data <<EOF * M 777 inline bob
Active Branch LRU
active_branches = 1 cur, 5 max pos clock name ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1) 0 refs/heads/master Inactive Branches
refs/heads/master: status : active loaded dirty tip commit : 0000000000000000000000000000000000000000 old tree : 0000000000000000000000000000000000000000 cur tree : 0000000000000000000000000000000000000000 commit clock: 0 last pack :
------------------- END OF CRASH REPORT
TRUCS ET ASTUCES
Les trucs et astuces suivants ont été collectés auprÚs de divers utilisateurs de fast-import, et sont proposés ici sous forme de suggestions.
Utiliser une marque par commit
Lors d’une conversion de dĂ©pĂŽt, utilisez une marque unique par commit (markâŻ:<n>
) et fournissez l’option --export-marks sur la ligne de commande. fast-import va gĂ©nĂ©rer un fichier qui liste chaque marque et l’objet Git SHA-1 qui lui correspond. Si le frontal peut relier les marques au dĂ©pĂŽt source, il est facile de vĂ©rifier l’exactitude et l’exhaustivitĂ© de l’importation en comparant chaque commit Git Ă la rĂ©vision source correspondante.
Si vous venez d’un systĂšme tel que Perforce ou Subversion, cela devrait ĂȘtre assez simple, car la marque d’importation rapide peut Ă©galement ĂȘtre le numĂ©ro de changeset de Perforce ou le numĂ©ro de rĂ©vision de Subversion.
Passez librement d’une branche Ă l’autre
Nâessayez pas dâoptimiser le frontal pour quâil sâattache Ă une seule branche Ă la fois pendant une importation. Bien que cela puisse ĂȘtre lĂ©gĂšrement plus rapide pour l’importation rapide, cela tend Ă augmenter considĂ©rablement la complexitĂ© du code frontal.
La LRU des branches intĂ©grĂ©e Ă fast-import tend Ă se comporter trĂšs bien, et le coĂ»t d’activation d’une branche inactive est si faible que le fait de rebondir entre les branches n’a pratiquement aucun impact sur les performances d’importation.
Gestion des renommages
Lors de l’importation d’un fichier ou d’un rĂ©pertoire renommĂ©, il suffit de supprimer le ou les anciens noms et de modifier le ou les nouveaux noms lors du commit correspondant. Git effectue la dĂ©tection des renommages aprĂšs coup, plutĂŽt qu’explicitement lors d’un commit.
Utilisez des branches de correction des Ă©tiquettes
Certains autres systĂšmes SCM permettent Ă l’utilisateur de crĂ©er une Ă©tiquette Ă partir de plusieurs fichiers qui ne sont pas du mĂȘme commit/changeset. Ou de crĂ©er des Ă©tiquettes qui sont un sous-ensemble des fichiers disponibles dans le dĂ©pĂŽt.
Importer ces Ă©tiquettes tels quels dans Git est impossible sans faire au moins un commit qui "rĂ©pare" les fichiers pour qu’ils correspondent au contenu de l’Ă©tiquette. Utilisez la commande ‘reset’ de fast-import’pour rĂ©initialiser une branche fictive en dehors de votre espace de branche normal au commit de base pour le tag, puis validez un ou plusieurs commits de correction de fichiers, et enfin Ă©tiquetez la branche fictive.
Par exemple, puisque toutes les branches normales sont stockées sous refs/heads/
, nommez la branche de correction des Ă©tiquettes CORRECTION_ETIQUETTE
. De cette façon, il est impossible que la branche de correction utilisĂ©e par l’importateur ait des conflits d’espace de noms avec les branches rĂ©elles importĂ©es depuis la source (le nom CORRECTION_ETIQUETTE
n’est pas refs/heads/CORRECTION_ETIQUETTE
).
Lorsque vous validez des corrections, pensez Ă utiliser merge
pour connecter le(s) commit(s) qui fournissent des rĂ©visions de fichiers Ă la branche de correction. Cela permettra Ă des outils tels que git blame de suivre l’historique rĂ©el des commits et d’annoter correctement les fichiers sources.
AprĂšs que fast-import se termine, le frontal devra faire rm .git/CORRECTION_ETIQUETTE
pour supprimer la branche factice.
Importez maintenant, ré-empaquetez plus tard
DĂšs que l’importation rapide est terminĂ©e, le dĂ©pĂŽt Git est complĂštement valide et prĂȘt Ă ĂȘtre utilisĂ©. En gĂ©nĂ©ral, cela ne prend que trĂšs peu de temps, mĂȘme pour les projets de grande envergure (plus de 100 000 commits).
Cependant, le repaquetage du dĂ©pĂŽt est nĂ©cessaire pour amĂ©liorer la localitĂ© des donnĂ©es et les performances d’accĂšs. Il peut Ă©galement prendre des heures sur des projets extrĂȘmement importants (surtout si -f et un grand paramĂštre --window sont utilisĂ©s). Puisque le rĂ©-empaquetage est sĂ»r Ă exĂ©cuter en mĂȘme temps que les lecteurs et les Ă©crivains, exĂ©cutez le rĂ©-empaquetage en arriĂšre-plan et laissez-le se terminer quand il se termine. Il n’y a aucune raison d’attendre pour explorer votre nouveau projet GitâŻ!
Si vous choisissez dâattendre la fin du rĂ©-empaquetage, nâessayez pas dâexĂ©cuter des benchmarks ou des tests de performance tant que le rĂ©-empaquetage nâest pas terminĂ©. fast-import produit des fichiers paquets sous-optimaux qui ne sont tout simplement jamais vus en situation rĂ©elle dâutilisation.
Ré-empaquetage des données historiques
Si vous rĂ©-empaquetez des donnĂ©es importĂ©es trĂšs anciennes (par exemple, plus anciennes que l’annĂ©e derniĂšre), envisagez de dĂ©penser un peu plus de temps CPU et de fournir --window=50 (ou plus) lorsque vous exĂ©cutez git repack. Cela prendra plus de temps, mais produira Ă©galement un fichier de paquetage plus petit. Vous n’aurez Ă faire cet effort qu’une seule fois, et tous les utilisateurs de votre projet bĂ©nĂ©ficieront d’un dĂ©pĂŽt plus petit.
Incluez des messages de progrĂšs
Every once in a while have your frontend emit a progress
message to fast-import. The contents of the messages are entirely free-form, so one suggestion would be to output the current month and year each time the current commit date moves into the next month. Your users will feel better knowing how much of the data stream has been processed.
PACKFILE OPTIMIZATION
When packing a blob fast-import always attempts to deltify against the last blob written. Unless specifically arranged for by the frontend, this will probably not be a prior version of the same file, so the generated delta will not be the smallest possible. The resulting packfile will be compressed, but will not be optimal.
Frontends which have efficient access to all revisions of a single file (for example reading an RCS/CVS ,v file) can choose to supply all revisions of that file as a sequence of consecutive blob
commands. This allows fast-import to deltify the different file revisions against each other, saving space in the final packfile. Marks can be used to later identify individual file revisions during a sequence of commit
commands.
The packfile(s) created by fast-import do not encourage good disk access patterns. This is caused by fast-import writing the data in the order it is received on standard input, while Git typically organizes data within packfiles to make the most recent (current tip) data appear before historical data. Git also clusters commits together, speeding up revision traversal through better cache locality.
For this reason it is strongly recommended that users repack the repository with git repack -a -d
after fast-import completes, allowing Git to reorganize the packfiles for faster data access. If blob deltas are suboptimal (see above) then also adding the -f
option to force recomputation of all deltas can significantly reduce the final packfile size (30-50% smaller can be quite typical).
Instead of running git repack
you can also run git gc --aggressive
, which will also optimize other things after an import (e.g. pack loose refs). As noted in the "AGGRESSIVE" section in git-gc[1] the --aggressive
option will find new deltas with the -f
option to git-repack[1]. For the reasons elaborated on above using --aggressive
after a fast-import is one of the few cases where it’s known to be worthwhile.
MEMORY UTILIZATION
There are a number of factors which affect how much memory fast-import requires to perform an import. Like critical sections of core Git, fast-import uses its own memory allocators to amortize any overheads associated with malloc. In practice fast-import tends to amortize any malloc overheads to 0, due to its use of large block allocations.
per object
fast-import maintains an in-memory structure for every object written in this execution. On a 32 bit system the structure is 32 bytes, on a 64 bit system the structure is 40 bytes (due to the larger pointer sizes). Objects in the table are not deallocated until fast-import terminates. Importing 2 million objects on a 32 bit system will require approximately 64 MiB of memory.
The object table is actually a hashtable keyed on the object name (the unique SHA-1). This storage configuration allows fast-import to reuse an existing or already written object and avoid writing duplicates to the output packfile. Duplicate blobs are surprisingly common in an import, typically due to branch merges in the source.
per mark
Marks are stored in a sparse array, using 1 pointer (4 bytes or 8 bytes, depending on pointer size) per mark. Although the array is sparse, frontends are still strongly encouraged to use marks between 1 and n, where n is the total number of marks required for this import.
per branch
Branches are classified as active and inactive. The memory usage of the two classes is significantly different.
Inactive branches are stored in a structure which uses 96 or 120 bytes (32 bit or 64 bit systems, respectively), plus the length of the branch name (typically under 200 bytes), per branch. fast-import will easily handle as many as 10,000 inactive branches in under 2 MiB of memory.
Active branches have the same overhead as inactive branches, but also contain copies of every tree that has been recently modified on that branch. If subtree include
has not been modified since the branch became active, its contents will not be loaded into memory, but if subtree src
has been modified by a commit since the branch became active, then its contents will be loaded in memory.
As active branches store metadata about the files contained on that branch, their in-memory storage size can grow to a considerable size (see below).
fast-import automatically moves active branches to inactive status based on a simple least-recently-used algorithm. The LRU chain is updated on each commit
command. The maximum number of active branches can be increased or decreased on the command line with --active-branches=.
par arbre actif
Trees (aka directories) use just 12 bytes of memory on top of the memory required for their entries (see “per active file” below). The cost of a tree is virtually 0, as its overhead amortizes out over the individual file entries.
par entrée active de fichier
Files (and pointers to subtrees) within active trees require 52 or 64 bytes (32/64 bit platforms) per entry. To conserve space, file and tree names are pooled in a common string table, allowing the filename “Makefile” to use just 16 bytes (after including the string header overhead) no matter how many times it occurs within the project.
The active branch LRU, when coupled with the filename string pool and lazy loading of subtrees, allows fast-import to efficiently import projects with 2,000+ branches and 45,114+ files in a very limited memory footprint (less than 2.7 MiB per active branch).
SIGNALS
Sending SIGUSR1 to the git fast-import process ends the current packfile early, simulating a checkpoint
command. The impatient operator can use this facility to peek at the objects and refs from an import in progress, at the cost of some added running time and worse compression.
CONFIGURATION
Warning
|
Missing See original version for this content. |
Warning
|
Missing See original version for this content. |
GIT
Fait partie de la suite git[1]
TRADUCTION
Cette page de manuel a été traduite par Jean-Noël Avila <jn.avila AT free DOT fr> et les membres du projet git-manpages-l10n. Veuillez signaler toute erreur de traduction par un rapport de bogue sur le site https://github.com/jnavila/git-manpages-l10n .