[{"data":1,"prerenderedAt":2488},["ShallowReactive",2],{"/fr-fr/blog/what-s-new-in-git-2-50-0":3,"navigation-fr-fr":1706,"banner-fr-fr":2139,"footer-fr-fr":2147,"blog-post-authors-fr-fr-Justin Tobler":2386,"blog-related-posts-fr-fr-what-s-new-in-git-2-50-0":2401,"blog-promotions-fr-fr":2425,"next-steps-fr-fr":2479},{"id":4,"title":5,"authors":6,"body":8,"category":1686,"date":1687,"description":1688,"extension":1689,"externalUrl":1690,"faq":1690,"featured":1691,"heroImage":1692,"meta":1693,"navigation":127,"path":1694,"seo":1695,"slug":1698,"stem":1699,"tags":1700,"template":1704,"updatedDate":1690,"__hash__":1705},"blogPosts/fr-fr/blog/what-s-new-in-git-2-50-0.md","Nouveautés de Git 2.50.0",[7],"Justin Tobler",{"type":9,"value":10,"toc":1678},"minimark",[11,22,27,45,48,79,82,93,175,187,193,196,215,218,225,228,265,277,285,292,296,307,310,600,603,613,616,624,627,630,719,733,740,747,751,761,764,942,945,952,1000,1006,1031,1041,1086,1089,1098,1104,1111,1121,1125,1143,1156,1159,1165,1178,1185,1189,1208,1215,1228,1641,1644,1651,1656,1660,1674],[12,13,14,15,21],"p",{},"Le projet Git a récemment publié la ",[16,17,20],"a",{"href":18,"rel":19},"https://lore.kernel.org/git/xmqq1prj1umb.fsf@gitster.g/T/#u",[],"version 2.50.0 de Git",".\nDécouvrons les points forts de cette nouvelle version, qui comprend les contributions de l'équipe Git de GitLab et de la communauté Git.",[23,24,26],"h2",{"id":25},"nouvelle-commande-git-diff-pairs1","Nouvelle commande git-diff-pairs(1)",[12,28,29,30,35,36,44],{},"Les diffs sont au cœur de chaque revue de code et affichent toutes les modifications apportées entre deux révisions. Dans GitLab, ils apparaissent à plusieurs endroits, généralement dans l'onglet ",[16,31,34],{"href":32,"rel":33},"https://docs.gitlab.com/user/project/merge_requests/changes/",[],"« Modifications »"," d'une merge request. En arrière-plan, la génération de diff est effectuée par ",[16,37,40],{"href":38,"rel":39},"https://git-scm.com/docs/git-diff",[],[41,42,43],"code",{},"git-diff(1)",".",[12,46,47],{},"Par exemple :",[49,50,55],"pre",{"className":51,"code":52,"language":53,"meta":54,"style":54},"language-shell shiki shiki-themes github-light","$ git diff HEAD~1 HEAD\n","shell","",[41,56,57],{"__ignoreMap":54},[58,59,62,66,70,73,76],"span",{"class":60,"line":61},"line",1,[58,63,65],{"class":64},"s7eDp","$",[58,67,69],{"class":68},"sYBdl"," git",[58,71,72],{"class":68}," diff",[58,74,75],{"class":68}," HEAD~1",[58,77,78],{"class":68}," HEAD\n",[12,80,81],{},"Cette commande renvoie le diff complet de tous les fichiers modifiés. Son utilisation peut poser un problème de performance, car le nombre de fichiers modifiés entre différentes versions du code peut être très important, et le backend GitLab risque de dépasser le délai d'attente maximal qu'il s'impose pour exécuter cette commande. Pour les grands ensembles de modifications, il est préférable de pouvoir diviser le calcul des diffs en blocs plus petits et plus faciles à traiter.",[12,83,84,85,92],{},"Pour ce faire, vous pouvez utiliser ",[16,86,89],{"href":87,"rel":88},"https://git-scm.com/docs/git-diff-tree/fr",[],[41,90,91],{},"git-diff-tree(1)"," pour récupérer des informations sur tous les fichiers modifiés :",[49,94,96],{"className":51,"code":95,"language":53,"meta":54,"style":54},"$ git diff-tree -r -M --abbrev HEAD~ HEAD\n\n:100644 100644 c9adfed339 99acf81487 M Documentation/RelNotes/2.50.0.adoc\n\n:100755 100755 1047b8d11d 208e91a17f M GIT-VERSION-GEN\n",[41,97,98,122,129,150,155],{"__ignoreMap":54},[58,99,100,102,104,107,111,114,117,120],{"class":60,"line":61},[58,101,65],{"class":64},[58,103,69],{"class":68},[58,105,106],{"class":68}," diff-tree",[58,108,110],{"class":109},"sYu0t"," -r",[58,112,113],{"class":109}," -M",[58,115,116],{"class":109}," --abbrev",[58,118,119],{"class":68}," HEAD~",[58,121,78],{"class":68},[58,123,125],{"class":60,"line":124},2,[58,126,128],{"emptyLinePlaceholder":127},true,"\n",[58,130,132,135,138,141,144,147],{"class":60,"line":131},3,[58,133,134],{"class":64},":100644",[58,136,137],{"class":109}," 100644",[58,139,140],{"class":68}," c9adfed339",[58,142,143],{"class":68}," 99acf81487",[58,145,146],{"class":68}," M",[58,148,149],{"class":68}," Documentation/RelNotes/2.50.0.adoc\n",[58,151,153],{"class":60,"line":152},4,[58,154,128],{"emptyLinePlaceholder":127},[58,156,158,161,164,167,170,172],{"class":60,"line":157},5,[58,159,160],{"class":64},":100755",[58,162,163],{"class":109}," 100755",[58,165,166],{"class":68}," 1047b8d11d",[58,168,169],{"class":68}," 208e91a17f",[58,171,146],{"class":68},[58,173,174],{"class":68}," GIT-VERSION-GEN\n",[12,176,177,178,182,183,186],{},"Git appelle ce résultat le ",[16,179,181],{"href":87,"rel":180},[],"format « brut »",". En bref, chaque ligne de sortie répertorie les paires de fichiers et les métadonnées associées en lien avec les modifications apportées entre les révisions de début et de fin. En comparaison avec la génération de diffs pour les modifications importantes, ce processus est relativement rapide et fournit un résumé de tous les éléments qui ont été modifiés. Cette commande peut éventuellement effectuer une détection de changement de nom en ajoutant ",[41,184,185],{},"-M"," pour vérifier si les modifications identifiées étaient dues à un changement de nom de fichier.",[12,188,189,190,192],{},"Avec ces informations, nous pourrions utiliser ",[41,191,43],{}," pour calculer chacun des diffs de paire de fichiers individuellement.",[12,194,195],{},"Par exemple, nous pouvons fournir directement des ID de blob :",[49,197,199],{"className":51,"code":198,"language":53,"meta":54,"style":54},"$ git diff 1047b8d11de767d290170979a9a20de1f5692e26 208e91a17f04558ca66bc19d73457ca64d5385f\n",[41,200,201],{"__ignoreMap":54},[58,202,203,205,207,209,212],{"class":60,"line":61},[58,204,65],{"class":64},[58,206,69],{"class":68},[58,208,72],{"class":68},[58,210,211],{"class":68}," 1047b8d11de767d290170979a9a20de1f5692e26",[58,213,214],{"class":68}," 208e91a17f04558ca66bc19d73457ca64d5385f\n",[12,216,217],{},"Nous pouvons répéter ce processus pour chacune des paires de fichiers, mais lancer un processus Git distinct pour chaque diff de fichier n'est pas une approche efficace. De plus, lorsque vous utilisez des ID de blob, le diff perd certaines informations contextuelles telles que le statut de modification et les modes de fichier qui sont stockés dans l'objet arbre parent. En réalité, nous avons besoin d'un mécanisme pouvant recevoir des informations « brutes » sur les paires de fichiers et générant en sortie les diffs correspondants.",[12,219,220,221,224],{},"Avec la version 2.50.0, Git dispose d’une nouvelle commande intégrée ",[41,222,223],{},"git-diff-pairs(1)",", qui reçoit sur son entrée standard (« stdin ») les informations de paires de fichiers au format « brut » pour déterminer avec précision les diffs à générer.",[12,226,227],{},"L'exemple suivant montre comment cette commande peut être utilisée :",[49,229,231],{"className":51,"code":230,"language":53,"meta":54,"style":54},"$ git diff-tree -r -z -M HEAD~ HEAD | git diff-pairs -z\n",[41,232,233],{"__ignoreMap":54},[58,234,235,237,239,241,243,246,248,250,253,257,259,262],{"class":60,"line":61},[58,236,65],{"class":64},[58,238,69],{"class":68},[58,240,106],{"class":68},[58,242,110],{"class":109},[58,244,245],{"class":109}," -z",[58,247,113],{"class":109},[58,249,119],{"class":68},[58,251,252],{"class":68}," HEAD",[58,254,256],{"class":255},"sD7c4"," |",[58,258,69],{"class":64},[58,260,261],{"class":68}," diff-pairs",[58,263,264],{"class":109}," -z\n",[12,266,267,268,270,271,273,274,276],{},"De cette façon, la sortie générée est identique à celle obtenue avec ",[41,269,43],{},". En utilisant une commande distincte pour générer la sortie de diffs, la sortie « brute » de ",[41,272,91],{}," peut être divisée en lots plus petits de paires de fichiers et envoyée vers des processus ",[41,275,223],{}," distincts. Cette approche résout le problème d'évolutivité mentionné précédemment, car le calcul des diffs ne s'effectue plus en une seule fois. Les futures versions de GitLab pourraient s'appuyer sur ce mécanisme pour améliorer les performances de génération de diff, en particulier lorsque de grands ensembles de modifications sont concernés.",[12,278,279,280,44],{},"Pour plus d'informations sur ce changement, consultez ce ",[16,281,284],{"href":282,"rel":283},"https://lore.kernel.org/git/20250228213346.1335224-1-jltobler@gmail.com/",[],"fil de discussion",[12,286,287,288,44],{},"Ce projet a été mené par ",[16,289,7],{"href":290,"rel":291},"https://gitlab.com/justintobler",[],[23,293,295],{"id":294},"mises-à-jour-des-références-par-lots","Mises à jour des références par lots",[12,297,298,299,302,303,306],{},"Git fournit la commande ",[41,300,301],{},"git-update-ref(1)"," pour effectuer des mises à jour de références. Lorsqu'elle est associée à ",[41,304,305],{},"--stdin",", il est possible de regrouper plusieurs mises à jour de références en une seule transaction en indiquant des instructions pour chaque mise à jour à effectuer sur l'entrée standard (« stdin »). La mise à jour des références en un seul lot offre également un comportement atomique : si une seule mise à jour échoue, la transaction est annulée et aucune référence n'est mise à jour.",[12,308,309],{},"Voici un exemple illustrant ce comportement :",[49,311,313],{"className":51,"code":312,"language":53,"meta":54,"style":54},"# Create repository with three empty commits and branch named \"foo\"\n\n$ git init\n\n$ git commit --allow-empty -m 1\n\n$ git commit --allow-empty -m 2\n\n$ git commit --allow-empty -m 3\n\n$ git branch foo\n\n# Print out the commit IDs\n\n$ git rev-list HEAD\n\ncf469bdf5436ea1ded57670b5f5a0797f72f1afc\n\n5a74cd330f04b96ce0666af89682d4d7580c354c\n\n5a6b339a8ebffde8c0590553045403dbda831518\n\n# Attempt to create a new reference and update existing reference in transaction.\n\n# Update is expected to fail because the specified old object ID doesn’t match.\n\n$ git update-ref --stdin \u003C\u003CEOF\n\n> create refs/heads/bar cf469bdf5436ea1ded57670b5f5a0797f72f1afc\n\n> update refs/heads/foo 5a6b339a8ebffde8c0590553045403dbda831518 5a74cd330f04b96ce0666af89682d4d7580c354c\n\n> EOF\n\nfatal: cannot lock ref 'refs/heads/foo': is at cf469bdf5436ea1ded57670b5f5a0797f72f1afc but expected 5a74cd330f04b96ce0666af89682d4d7580c354c\n\n# The \"bar\" reference was not created.\n\n$ git switch bar\n\nfatal: invalid reference: bar\n",[41,314,315,321,325,334,338,356,361,377,382,398,403,416,421,427,432,444,449,455,460,466,471,477,482,488,493,499,504,523,528,534,539,545,550,556,561,567,572,578,583,589,594],{"__ignoreMap":54},[58,316,317],{"class":60,"line":61},[58,318,320],{"class":319},"sAwPA","# Create repository with three empty commits and branch named \"foo\"\n",[58,322,323],{"class":60,"line":124},[58,324,128],{"emptyLinePlaceholder":127},[58,326,327,329,331],{"class":60,"line":131},[58,328,65],{"class":64},[58,330,69],{"class":68},[58,332,333],{"class":68}," init\n",[58,335,336],{"class":60,"line":152},[58,337,128],{"emptyLinePlaceholder":127},[58,339,340,342,344,347,350,353],{"class":60,"line":157},[58,341,65],{"class":64},[58,343,69],{"class":68},[58,345,346],{"class":68}," commit",[58,348,349],{"class":109}," --allow-empty",[58,351,352],{"class":109}," -m",[58,354,355],{"class":109}," 1\n",[58,357,359],{"class":60,"line":358},6,[58,360,128],{"emptyLinePlaceholder":127},[58,362,364,366,368,370,372,374],{"class":60,"line":363},7,[58,365,65],{"class":64},[58,367,69],{"class":68},[58,369,346],{"class":68},[58,371,349],{"class":109},[58,373,352],{"class":109},[58,375,376],{"class":109}," 2\n",[58,378,380],{"class":60,"line":379},8,[58,381,128],{"emptyLinePlaceholder":127},[58,383,385,387,389,391,393,395],{"class":60,"line":384},9,[58,386,65],{"class":64},[58,388,69],{"class":68},[58,390,346],{"class":68},[58,392,349],{"class":109},[58,394,352],{"class":109},[58,396,397],{"class":109}," 3\n",[58,399,401],{"class":60,"line":400},10,[58,402,128],{"emptyLinePlaceholder":127},[58,404,406,408,410,413],{"class":60,"line":405},11,[58,407,65],{"class":64},[58,409,69],{"class":68},[58,411,412],{"class":68}," branch",[58,414,415],{"class":68}," foo\n",[58,417,419],{"class":60,"line":418},12,[58,420,128],{"emptyLinePlaceholder":127},[58,422,424],{"class":60,"line":423},13,[58,425,426],{"class":319},"# Print out the commit IDs\n",[58,428,430],{"class":60,"line":429},14,[58,431,128],{"emptyLinePlaceholder":127},[58,433,435,437,439,442],{"class":60,"line":434},15,[58,436,65],{"class":64},[58,438,69],{"class":68},[58,440,441],{"class":68}," rev-list",[58,443,78],{"class":68},[58,445,447],{"class":60,"line":446},16,[58,448,128],{"emptyLinePlaceholder":127},[58,450,452],{"class":60,"line":451},17,[58,453,454],{"class":64},"cf469bdf5436ea1ded57670b5f5a0797f72f1afc\n",[58,456,458],{"class":60,"line":457},18,[58,459,128],{"emptyLinePlaceholder":127},[58,461,463],{"class":60,"line":462},19,[58,464,465],{"class":64},"5a74cd330f04b96ce0666af89682d4d7580c354c\n",[58,467,469],{"class":60,"line":468},20,[58,470,128],{"emptyLinePlaceholder":127},[58,472,474],{"class":60,"line":473},21,[58,475,476],{"class":64},"5a6b339a8ebffde8c0590553045403dbda831518\n",[58,478,480],{"class":60,"line":479},22,[58,481,128],{"emptyLinePlaceholder":127},[58,483,485],{"class":60,"line":484},23,[58,486,487],{"class":319},"# Attempt to create a new reference and update existing reference in transaction.\n",[58,489,491],{"class":60,"line":490},24,[58,492,128],{"emptyLinePlaceholder":127},[58,494,496],{"class":60,"line":495},25,[58,497,498],{"class":319},"# Update is expected to fail because the specified old object ID doesn’t match.\n",[58,500,502],{"class":60,"line":501},26,[58,503,128],{"emptyLinePlaceholder":127},[58,505,507,509,511,514,517,520],{"class":60,"line":506},27,[58,508,65],{"class":64},[58,510,69],{"class":68},[58,512,513],{"class":68}," update-ref",[58,515,516],{"class":109}," --stdin",[58,518,519],{"class":255}," \u003C\u003C",[58,521,522],{"class":68},"EOF\n",[58,524,526],{"class":60,"line":525},28,[58,527,128],{"emptyLinePlaceholder":127},[58,529,531],{"class":60,"line":530},29,[58,532,533],{"class":68},"> create refs/heads/bar cf469bdf5436ea1ded57670b5f5a0797f72f1afc\n",[58,535,537],{"class":60,"line":536},30,[58,538,128],{"emptyLinePlaceholder":127},[58,540,542],{"class":60,"line":541},31,[58,543,544],{"class":68},"> update refs/heads/foo 5a6b339a8ebffde8c0590553045403dbda831518 5a74cd330f04b96ce0666af89682d4d7580c354c\n",[58,546,548],{"class":60,"line":547},32,[58,549,128],{"emptyLinePlaceholder":127},[58,551,553],{"class":60,"line":552},33,[58,554,555],{"class":68},"> EOF\n",[58,557,559],{"class":60,"line":558},34,[58,560,128],{"emptyLinePlaceholder":127},[58,562,564],{"class":60,"line":563},35,[58,565,566],{"class":68},"fatal: cannot lock ref 'refs/heads/foo': is at cf469bdf5436ea1ded57670b5f5a0797f72f1afc but expected 5a74cd330f04b96ce0666af89682d4d7580c354c\n",[58,568,570],{"class":60,"line":569},36,[58,571,128],{"emptyLinePlaceholder":127},[58,573,575],{"class":60,"line":574},37,[58,576,577],{"class":68},"# The \"bar\" reference was not created.\n",[58,579,581],{"class":60,"line":580},38,[58,582,128],{"emptyLinePlaceholder":127},[58,584,586],{"class":60,"line":585},39,[58,587,588],{"class":68},"$ git switch bar\n",[58,590,592],{"class":60,"line":591},40,[58,593,128],{"emptyLinePlaceholder":127},[58,595,597],{"class":60,"line":596},41,[58,598,599],{"class":68},"fatal: invalid reference: bar\n",[12,601,602],{},"En comparaison avec la mise à jour de nombreuses références une par une, la mise à jour par lot est également beaucoup plus efficace. Toutefois, dans certaines circonstances, il peut être acceptable qu'un sous-ensemble des mises à jour de références demandées échoue. Mais nous voulons quand même bénéficier de l'efficacité des mises à jour par lot.",[12,604,605,606,608,609,612],{},"Avec cette version, ",[41,607,301],{}," met à disposition la nouvelle option ",[41,610,611],{},"--batch-updates",", qui permet aux mises à jour de se poursuivre même lorsqu'une ou plusieurs mises à jour de références échouent.",[12,614,615],{},"Dans ce mode, les échecs individuels sont signalés dans le format suivant :",[49,617,622],{"className":618,"code":620,"language":621,"meta":54},[619],"language-text","rejected SP (\u003Cold-oid> | \u003Cold-target>) SP (\u003Cnew-oid> | \u003Cnew-target>) SP \u003Crejection-reason> LF\n","text",[41,623,620],{"__ignoreMap":54},[12,625,626],{},"Il est ainsi possible de poursuivre les mises à jour de références réussies, tout en fournissant un contexte indiquant celles qui ont été rejetées et pour quelle raison.",[12,628,629],{},"Voici ce que nous obtenons en utilisant le même exemple de dépôt que dans l'exemple précédent :",[49,631,633],{"className":51,"code":632,"language":53,"meta":54,"style":54},"# Attempt to create a new reference and update existing reference in transaction.\n\n$ git update-ref --stdin --batch-updates \u003C\u003CEOF\n\n> create refs/heads/bar cf469bdf5436ea1ded57670b5f5a0797f72f1afc\n\n> update refs/heads/foo 5a6b339a8ebffde8c0590553045403dbda831518 5a74cd330f04b96ce0666af89682d4d7580c354c\n\n> EOF\n\nrejected refs/heads/foo 5a6b339a8ebffde8c0590553045403dbda831518 5a74cd330f04b96ce0666af89682d4d7580c354c incorrect old value provided\n\n# The \"bar\" reference was created even though the update to \"foo\" was rejected.\n\n$ git switch bar\n\nSwitched to branch 'bar'\n",[41,634,635,639,643,660,664,668,672,676,680,684,688,693,697,702,706,710,714],{"__ignoreMap":54},[58,636,637],{"class":60,"line":61},[58,638,487],{"class":319},[58,640,641],{"class":60,"line":124},[58,642,128],{"emptyLinePlaceholder":127},[58,644,645,647,649,651,653,656,658],{"class":60,"line":131},[58,646,65],{"class":64},[58,648,69],{"class":68},[58,650,513],{"class":68},[58,652,516],{"class":109},[58,654,655],{"class":109}," --batch-updates",[58,657,519],{"class":255},[58,659,522],{"class":68},[58,661,662],{"class":60,"line":152},[58,663,128],{"emptyLinePlaceholder":127},[58,665,666],{"class":60,"line":157},[58,667,533],{"class":68},[58,669,670],{"class":60,"line":358},[58,671,128],{"emptyLinePlaceholder":127},[58,673,674],{"class":60,"line":363},[58,675,544],{"class":68},[58,677,678],{"class":60,"line":379},[58,679,128],{"emptyLinePlaceholder":127},[58,681,682],{"class":60,"line":384},[58,683,555],{"class":68},[58,685,686],{"class":60,"line":400},[58,687,128],{"emptyLinePlaceholder":127},[58,689,690],{"class":60,"line":405},[58,691,692],{"class":68},"rejected refs/heads/foo 5a6b339a8ebffde8c0590553045403dbda831518 5a74cd330f04b96ce0666af89682d4d7580c354c incorrect old value provided\n",[58,694,695],{"class":60,"line":418},[58,696,128],{"emptyLinePlaceholder":127},[58,698,699],{"class":60,"line":423},[58,700,701],{"class":68},"# The \"bar\" reference was created even though the update to \"foo\" was rejected.\n",[58,703,704],{"class":60,"line":429},[58,705,128],{"emptyLinePlaceholder":127},[58,707,708],{"class":60,"line":434},[58,709,588],{"class":68},[58,711,712],{"class":60,"line":446},[58,713,128],{"emptyLinePlaceholder":127},[58,715,716],{"class":60,"line":451},[58,717,718],{"class":68},"Switched to branch 'bar'\n",[12,720,721,722,724,725,728,729,732],{},"Cette fois, avec l'option ",[41,723,611],{},", la création de la référence a réussi même si la mise à jour n'a pas fonctionné. Cette série de diffs est un aperçu des futures améliorations des performances de ",[41,726,727],{},"git-fetch(1)"," et ",[41,730,731],{},"git-receive-pack(1)"," lors de la mise à jour de références par lot.",[12,734,735,736,44],{},"Pour plus d'informations, consultez ce ",[16,737,284],{"href":738,"rel":739},"https://lore.kernel.org/git/20250408085120.614893-1-karthik.188@gmail.com/",[],[12,741,287,742,44],{},[16,743,746],{"href":744,"rel":745},"https://gitlab.com/knayakgl",[],"Karthik Nayak",[23,748,750],{"id":749},"nouvelle-option-de-filtre-pour-git-cat-file1","Nouvelle option de filtre pour git-cat-file(1)",[12,752,753,754,757,758,44],{},"Avec ",[41,755,756],{},"git-cat-file(1)",", il est possible d’afficher des informations pour tous les objets contenus dans le dépôt via l'option ",[41,759,760],{},"--batch–all-objects",[12,762,763],{},"En voici un exemple :",[49,765,767],{"className":51,"code":766,"language":53,"meta":54,"style":54},"# Setup simple repository.\n\n$ git init\n\n$ echo foo >foo\n\n$ git add foo\n\n$ git commit -m init\n\n# Create an unreachable object.\n\n$ git commit --amend --no-edit\n\n# Use git-cat-file(1) to print info about all objects including unreachable objects.\n\n$ git cat-file --batch-all-objects --batch-check='%(objecttype) %(objectname)'\n\ncommit 0b07e71d14897f218f23d9a6e39605b466454ece\n\ntree 205f6b799e7d5c2524468ca006a0131aa57ecce7\n\nblob 257cc5642cb1a054f08cc83f2d943e56fd3ebe99\n\ncommit c999f781fd7214b3caab82f560ffd079ddad0115\n",[41,768,769,774,778,786,790,806,810,821,825,837,841,846,850,864,868,873,877,895,899,907,911,919,923,931,935],{"__ignoreMap":54},[58,770,771],{"class":60,"line":61},[58,772,773],{"class":319},"# Setup simple repository.\n",[58,775,776],{"class":60,"line":124},[58,777,128],{"emptyLinePlaceholder":127},[58,779,780,782,784],{"class":60,"line":131},[58,781,65],{"class":64},[58,783,69],{"class":68},[58,785,333],{"class":68},[58,787,788],{"class":60,"line":152},[58,789,128],{"emptyLinePlaceholder":127},[58,791,792,794,797,800,803],{"class":60,"line":157},[58,793,65],{"class":64},[58,795,796],{"class":68}," echo",[58,798,799],{"class":68}," foo",[58,801,802],{"class":255}," >",[58,804,805],{"class":68},"foo\n",[58,807,808],{"class":60,"line":358},[58,809,128],{"emptyLinePlaceholder":127},[58,811,812,814,816,819],{"class":60,"line":363},[58,813,65],{"class":64},[58,815,69],{"class":68},[58,817,818],{"class":68}," add",[58,820,415],{"class":68},[58,822,823],{"class":60,"line":379},[58,824,128],{"emptyLinePlaceholder":127},[58,826,827,829,831,833,835],{"class":60,"line":384},[58,828,65],{"class":64},[58,830,69],{"class":68},[58,832,346],{"class":68},[58,834,352],{"class":109},[58,836,333],{"class":68},[58,838,839],{"class":60,"line":400},[58,840,128],{"emptyLinePlaceholder":127},[58,842,843],{"class":60,"line":405},[58,844,845],{"class":319},"# Create an unreachable object.\n",[58,847,848],{"class":60,"line":418},[58,849,128],{"emptyLinePlaceholder":127},[58,851,852,854,856,858,861],{"class":60,"line":423},[58,853,65],{"class":64},[58,855,69],{"class":68},[58,857,346],{"class":68},[58,859,860],{"class":109}," --amend",[58,862,863],{"class":109}," --no-edit\n",[58,865,866],{"class":60,"line":429},[58,867,128],{"emptyLinePlaceholder":127},[58,869,870],{"class":60,"line":434},[58,871,872],{"class":319},"# Use git-cat-file(1) to print info about all objects including unreachable objects.\n",[58,874,875],{"class":60,"line":446},[58,876,128],{"emptyLinePlaceholder":127},[58,878,879,881,883,886,889,892],{"class":60,"line":451},[58,880,65],{"class":64},[58,882,69],{"class":68},[58,884,885],{"class":68}," cat-file",[58,887,888],{"class":109}," --batch-all-objects",[58,890,891],{"class":109}," --batch-check=",[58,893,894],{"class":68},"'%(objecttype) %(objectname)'\n",[58,896,897],{"class":60,"line":457},[58,898,128],{"emptyLinePlaceholder":127},[58,900,901,904],{"class":60,"line":462},[58,902,903],{"class":64},"commit",[58,905,906],{"class":68}," 0b07e71d14897f218f23d9a6e39605b466454ece\n",[58,908,909],{"class":60,"line":468},[58,910,128],{"emptyLinePlaceholder":127},[58,912,913,916],{"class":60,"line":473},[58,914,915],{"class":64},"tree",[58,917,918],{"class":68}," 205f6b799e7d5c2524468ca006a0131aa57ecce7\n",[58,920,921],{"class":60,"line":479},[58,922,128],{"emptyLinePlaceholder":127},[58,924,925,928],{"class":60,"line":484},[58,926,927],{"class":64},"blob",[58,929,930],{"class":68}," 257cc5642cb1a054f08cc83f2d943e56fd3ebe99\n",[58,932,933],{"class":60,"line":490},[58,934,128],{"emptyLinePlaceholder":127},[58,936,937,939],{"class":60,"line":495},[58,938,903],{"class":64},[58,940,941],{"class":68}," c999f781fd7214b3caab82f560ffd079ddad0115\n",[12,943,944],{},"Dans certains cas, un utilisateur peut effectuer une recherche dans tous les objets du dépôt, mais n'afficher qu'un sous-ensemble basé sur un attribut spécifique.",[12,946,947,948,951],{},"Par exemple, si nous voulons voir uniquement les objets qui sont des commits, nous pouvons utiliser ",[41,949,950],{},"grep(1)"," :",[49,953,955],{"className":51,"code":954,"language":53,"meta":54,"style":54},"$ git cat-file --batch-all-objects --batch-check='%(objecttype) %(objectname)' | grep ^commit\n\ncommit 0b07e71d14897f218f23d9a6e39605b466454ece\n\ncommit c999f781fd7214b3caab82f560ffd079ddad0115\n",[41,956,957,980,984,990,994],{"__ignoreMap":54},[58,958,959,961,963,965,967,969,972,974,977],{"class":60,"line":61},[58,960,65],{"class":64},[58,962,69],{"class":68},[58,964,885],{"class":68},[58,966,888],{"class":109},[58,968,891],{"class":109},[58,970,971],{"class":68},"'%(objecttype) %(objectname)'",[58,973,256],{"class":255},[58,975,976],{"class":64}," grep",[58,978,979],{"class":68}," ^commit\n",[58,981,982],{"class":60,"line":124},[58,983,128],{"emptyLinePlaceholder":127},[58,985,986,988],{"class":60,"line":131},[58,987,903],{"class":64},[58,989,906],{"class":68},[58,991,992],{"class":60,"line":152},[58,993,128],{"emptyLinePlaceholder":127},[58,995,996,998],{"class":60,"line":157},[58,997,903],{"class":64},[58,999,941],{"class":68},[12,1001,1002,1003,1005],{},"Bien que cela fonctionne, un des inconvénients du filtrage de la sortie est que ",[41,1004,756],{}," doit toujours parcourir tous les objets du dépôt, même ceux qui n'intéressent pas l'utilisateur. Cette approche peut se révéler assez inefficace.",[12,1007,1008,1009,1011,1012,1015,1016,1019,1020,1023,1024,1027,1028,44],{},"Avec la version 2.50.0, ",[41,1010,756],{}," dispose désormais de l'option ",[41,1013,1014],{},"--filter",", qui n'affiche que les objets correspondant aux critères spécifiés. Celle-ci est similaire à l'option du même nom pour ",[41,1017,1018],{},"git-rev-list(1)",", mais seul un sous-ensemble des filtres est pris en charge : ",[41,1021,1022],{},"blob:none",", ",[41,1025,1026],{},"blob:limit=",", ainsi que ",[41,1029,1030],{},"object:type=",[12,1032,1033,1034,1040],{},"Comme dans l'exemple précédent, il est possible de filtrer les objets par type avec ",[16,1035,1039],{"href":1036,"rel":1037,"title":1038},"https://about.gitlab.com/fr-fr/blog/what-is-git/",[],"Qu'est-ce que Git ?","Git"," directement :",[49,1042,1044],{"className":51,"code":1043,"language":53,"meta":54,"style":54},"$ git cat-file --batch-all-objects --batch-check='%(objecttype) %(objectname)' --filter='object:type=commit'\n\ncommit 0b07e71d14897f218f23d9a6e39605b466454ece\n\ncommit c999f781fd7214b3caab82f560ffd079ddad0115\n",[41,1045,1046,1066,1070,1076,1080],{"__ignoreMap":54},[58,1047,1048,1050,1052,1054,1056,1058,1060,1063],{"class":60,"line":61},[58,1049,65],{"class":64},[58,1051,69],{"class":68},[58,1053,885],{"class":68},[58,1055,888],{"class":109},[58,1057,891],{"class":109},[58,1059,971],{"class":68},[58,1061,1062],{"class":109}," --filter=",[58,1064,1065],{"class":68},"'object:type=commit'\n",[58,1067,1068],{"class":60,"line":124},[58,1069,128],{"emptyLinePlaceholder":127},[58,1071,1072,1074],{"class":60,"line":131},[58,1073,903],{"class":64},[58,1075,906],{"class":68},[58,1077,1078],{"class":60,"line":152},[58,1079,128],{"emptyLinePlaceholder":127},[58,1081,1082,1084],{"class":60,"line":157},[58,1083,903],{"class":64},[58,1085,941],{"class":68},[12,1087,1088],{},"Non seulement il est pratique de laisser Git s'occuper du traitement, mais pour les dépôts volumineux contenant de nombreux objets, c'est aussi potentiellement plus efficace. Si un dépôt dispose d'index bitmap, Git peut rechercher efficacement des objets d'un type spécifique, sans scanner le fichier d'empaquetage (« packfile »), ce qui accélère significativement le processus.",[12,1090,1091,1092,1097],{},"Les benchmarks effectués sur le ",[16,1093,1096],{"href":1094,"rel":1095},"https://github.com/chromium/chromium.git",[],"dépôt Chromium"," montrent des améliorations significatives :",[49,1099,1102],{"className":1100,"code":1101,"language":621,"meta":54},[619],"Benchmark 1: git cat-file --batch-check --batch-all-objects --unordered --buffer --no-filter\n\nTime (mean ± σ): 82.806 s ± 6.363 s [User: 30.956 s, System: 8.264 s]\n\nRange (min … max): 73.936 s … 89.690 s 10 runs\n\nBenchmark 2: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=tag\n\nTime (mean ± σ): 20.8 ms ± 1.3 ms [User: 6.1 ms, System: 14.5 ms]\n\nRange (min … max): 18.2 ms … 23.6 ms 127 runs\n\nBenchmark 3: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=commit\n\nTime (mean ± σ): 1.551 s ± 0.008 s [User: 1.401 s, System: 0.147 s]\n\nRange (min … max): 1.541 s … 1.566 s 10 runs\n\nBenchmark 4: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=tree\n\nTime (mean ± σ): 11.169 s ± 0.046 s [User: 10.076 s, System: 1.063 s]\n\nRange (min … max): 11.114 s … 11.245 s 10 runs\n\nBenchmark 5: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=blob\n\nTime (mean ± σ): 67.342 s ± 3.368 s [User: 20.318 s, System: 7.787 s]\n\nRange (min … max): 62.836 s … 73.618 s 10 runs\n\nBenchmark 6: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=blob:none\n\nTime (mean ± σ): 13.032 s ± 0.072 s [User: 11.638 s, System: 1.368 s]\n\nRange (min … max): 12.960 s … 13.199 s 10 runs\n\nSummary\n\ngit cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=tag\n\n74.75 ± 4.61 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=commit\n\n538.17 ± 33.17 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=tree\n\n627.98 ± 38.77 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=blob:none\n\n3244.93 ± 257.23 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=blob\n\n3990.07 ± 392.72 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --no-filter\n",[41,1103,1101],{"__ignoreMap":54},[12,1105,1106,1107,44],{},"Il est intéressant de noter que ces résultats indiquent que le temps de calcul est maintenant proportionnel au nombre d'objets pour un type donné plutôt qu'au nombre total d'objets dans le fichier d'empaquetage. Pour plus d'informations, consultez ce ",[16,1108,284],{"href":1109,"rel":1110},"https://lore.kernel.org/git/20250221-pks-cat-file-object-type-filter-v1-0-0852530888e2@pks.im/",[],[12,1112,1113],{},[1114,1115,287,1116,44],"em",{},[16,1117,1120],{"href":1118,"rel":1119},"https://gitlab.com/pks-gitlab",[],"Patrick Steinhardt",[23,1122,1124],{"id":1123},"amélioration-des-performances-lors-de-la-génération-darchives","Amélioration des performances lors de la génération d'archives",[12,1126,1127,1128,1135,1136,44],{},"Avec Git, vous pouvez générer une archive d'un dépôt qui contient un ensemble spécifié de références et d'objets accessibles qui les accompagnent via la commande ",[16,1129,1132],{"href":1130,"rel":1131},"https://git-scm.com/docs/git-bundle/fr",[],[41,1133,1134],{},"git-bundle(1)",". Cette opération est utilisée par GitLab pour générer des sauvegardes de dépôt et dans le cadre du mécanisme ",[16,1137,1140],{"href":1138,"rel":1139},"https://git-scm.com/docs/bundle-uri",[],[41,1141,1142],{},"bundle-URI",[12,1144,1145,1146,1151,1152,1155],{},"Pour les grands dépôts contenant des millions de références, cette opération peut prendre plusieurs heures, voire même plusieurs jours. Par exemple, avec le dépôt principal de GitLab (",[16,1147,1150],{"href":1148,"rel":1149},"https://gitlab.com/gitlab-org/gitlab",[],"gitlab-org/gitlab","), les temps de sauvegarde étaient d'environ 48 heures. Des recherches ont révélé la présence d'un goulot d'étranglement des performances en raison de la façon dont Git effectuait une vérification pour éviter que des références dupliquées ne soient incluses dans l'archive. L'implémentation utilisait une boucle ",[41,1153,1154],{},"for"," imbriquée pour itérer et comparer toutes les références répertoriées, ce qui entrainait une complexité temporelle O(N^2). Cette façon de procéder dégradait fortement les performances à mesure que le nombre de références dans un dépôt augmentait.",[12,1157,1158],{},"Dans la version 2.50.0, ce problème a été résolu en remplaçant les boucles imbriquées par un tableau associatif, ce qui a permis d'accélérer considérablement le processus. Le benchmark suivant montre l'amélioration des performances lors de la création d'une archive avec un dépôt contenant 100 000 références :",[49,1160,1163],{"className":1161,"code":1162,"language":621,"meta":54},[619],"Benchmark 1: bundle (refcount = 100000, revision = master)\n\nTime (mean ± σ): 14.653 s ± 0.203 s [User: 13.940 s, System: 0.762 s]\n\nRange (min … max): 14.237 s … 14.920 s 10 runs\n\nBenchmark 2: bundle (refcount = 100000, revision = HEAD)\n\nTime (mean ± σ): 2.394 s ± 0.023 s [User: 1.684 s, System: 0.798 s]\n\nRange (min … max): 2.364 s … 2.425 s 10 runs\n\nSummary\n\nbundle (refcount = 100000, revision = HEAD) ran\n\n6.12 ± 0.10 times faster than bundle (refcount = 100000, revision = master)\n",[41,1164,1162],{"__ignoreMap":54},[12,1166,1167,1168,1173,1174,44],{},"Pour en savoir plus, découvrez notre article de blog qui explique ",[16,1169,1172],{"href":1170,"rel":1171},"https://about.gitlab.com/blog/how-we-decreased-gitlab-repo-backup-times-from-48-hours-to-41-minutes/",[],"comment nous avons réduit les temps de sauvegarde du dépôt GitLab de 48 heures à 41 minutes"," et consultez ce ",[16,1175,284],{"href":1176,"rel":1177},"https://lore.kernel.org/git/20250401-488-generating-bundles-with-many-references-has-non-linear-performance-v1-0-6d23b2d96557@gmail.com/",[],[12,1179,1180],{},[1114,1181,287,1182,44],{},[16,1183,746],{"href":744,"rel":1184},[],[23,1186,1188],{"id":1187},"meilleur-dégroupage-des-uri-darchives","Meilleur dégroupage des URI d'archives",[12,1190,1191,1192,1196,1197,1200,1201,1203,1204,1207],{},"À l'aide du mécanisme ",[16,1193,1195],{"href":1138,"rel":1194},[],"bundle-uri"," dans Git, il est possible de fournir aux clients les emplacements pour récupérer des archives dans le but d'accélérer les clones et les récupérations. Lorsqu'un client télécharge une archive, les références sous ",[41,1198,1199],{},"refs/heads/*"," et les objets qui les accompagnent sont copiés de l'archive dans le dépôt. Une archive peut contenir des références supplémentaires en dehors de ",[41,1202,1199],{}," telles que ",[41,1205,1206],{},"refs/tags/*",", qui sont simplement ignorées lors de l'utilisation de bundle-uri sur le clone.",[12,1209,1210,1211,1214],{},"Dans Git 2.50.0, cette restriction est levée. Par conséquent, toutes les références correspondant à ",[41,1212,1213],{},"refs/*"," contenues dans l'archive téléchargée sont copiées.",[12,1216,1217,1222,1223,951],{},[16,1218,1221],{"href":1219,"rel":1220},"https://github.com/schacon",[],"Scott Chacon",", qui a contribué à cette fonctionnalité, montre la différence lors du clonage de ",[16,1224,1227],{"href":1225,"rel":1226},"https://gitlab.com/gitlab-org/gitlab-foss",[],"gitlab-org/gitlab-foss",[49,1229,1231],{"className":51,"code":1230,"language":53,"meta":54,"style":54},"$ git-v2.49 clone --bundle-uri=gitlab-base.bundle https://gitlab.com/gitlab-org/gitlab-foss.git gl-2.49\n\nCloning into 'gl2.49'...\n\nremote: Enumerating objects: 1092703, done.\n\nremote: Counting objects: 100% (973405/973405), done.\n\nremote: Compressing objects: 100% (385827/385827), done.\n\nremote: Total 959773 (delta 710976), reused 766809 (delta 554276), pack-reused 0 (from 0)\n\nReceiving objects: 100% (959773/959773), 366.94 MiB | 20.87 MiB/s, done.\n\nResolving deltas: 100% (710976/710976), completed with 9081 local objects.\n\nChecking objects: 100% (4194304/4194304), done.\n\nChecking connectivity: 959668, done.\n\nUpdating files: 100% (59972/59972), done.\n\n$ git-v2.50 clone --bundle-uri=gitlab-base.bundle https://gitlab.com/gitlab-org/gitlab-foss.git gl-2.50\n\nCloning into 'gl-2.50'...\n\nremote: Enumerating objects: 65538, done.\n\nremote: Counting objects: 100% (56054/56054), done.\n\nremote: Compressing objects: 100% (28950/28950), done.\n\nremote: Total 43877 (delta 27401), reused 25170 (delta 13546), pack-reused 0 (from 0)\n\nReceiving objects: 100% (43877/43877), 40.42 MiB | 22.27 MiB/s, done.\n\nResolving deltas: 100% (27401/27401), completed with 8564 local objects.\n\nUpdating files: 100% (59972/59972), done.\n",[41,1232,1233,1252,1256,1267,1271,1288,1292,1308,1312,1326,1330,1367,1371,1394,1398,1417,1421,1433,1437,1449,1453,1466,1470,1486,1490,1499,1503,1516,1520,1533,1537,1550,1554,1584,1588,1608,1612,1627,1631],{"__ignoreMap":54},[58,1234,1235,1237,1240,1243,1246,1249],{"class":60,"line":61},[58,1236,65],{"class":64},[58,1238,1239],{"class":68}," git-v2.49",[58,1241,1242],{"class":68}," clone",[58,1244,1245],{"class":109}," --bundle-uri=gitlab-base.bundle",[58,1247,1248],{"class":68}," https://gitlab.com/gitlab-org/gitlab-foss.git",[58,1250,1251],{"class":68}," gl-2.49\n",[58,1253,1254],{"class":60,"line":124},[58,1255,128],{"emptyLinePlaceholder":127},[58,1257,1258,1261,1264],{"class":60,"line":131},[58,1259,1260],{"class":64},"Cloning",[58,1262,1263],{"class":68}," into",[58,1265,1266],{"class":68}," 'gl2.49'...\n",[58,1268,1269],{"class":60,"line":152},[58,1270,128],{"emptyLinePlaceholder":127},[58,1272,1273,1276,1279,1282,1285],{"class":60,"line":157},[58,1274,1275],{"class":64},"remote:",[58,1277,1278],{"class":68}," Enumerating",[58,1280,1281],{"class":68}," objects:",[58,1283,1284],{"class":68}," 1092703,",[58,1286,1287],{"class":68}," done.\n",[58,1289,1290],{"class":60,"line":358},[58,1291,128],{"emptyLinePlaceholder":127},[58,1293,1294,1296,1299,1301,1304],{"class":60,"line":363},[58,1295,1275],{"class":64},[58,1297,1298],{"class":68}," Counting",[58,1300,1281],{"class":68},[58,1302,1303],{"class":68}," 100%",[58,1305,1307],{"class":1306},"sgsFI"," (973405/973405), done.\n",[58,1309,1310],{"class":60,"line":379},[58,1311,128],{"emptyLinePlaceholder":127},[58,1313,1314,1316,1319,1321,1323],{"class":60,"line":384},[58,1315,1275],{"class":64},[58,1317,1318],{"class":68}," Compressing",[58,1320,1281],{"class":68},[58,1322,1303],{"class":68},[58,1324,1325],{"class":1306}," (385827/385827), done.\n",[58,1327,1328],{"class":60,"line":400},[58,1329,128],{"emptyLinePlaceholder":127},[58,1331,1332,1334,1337,1340,1343,1346,1349,1352,1355,1358,1361,1364],{"class":60,"line":405},[58,1333,1275],{"class":64},[58,1335,1336],{"class":68}," Total",[58,1338,1339],{"class":109}," 959773",[58,1341,1342],{"class":1306}," (delta ",[58,1344,1345],{"class":109},"710976",[58,1347,1348],{"class":1306},"), reused 766809 (",[58,1350,1351],{"class":64},"delta",[58,1353,1354],{"class":109}," 554276",[58,1356,1357],{"class":1306},"), pack-reused 0 (",[58,1359,1360],{"class":64},"from",[58,1362,1363],{"class":109}," 0",[58,1365,1366],{"class":1306},")\n",[58,1368,1369],{"class":60,"line":418},[58,1370,128],{"emptyLinePlaceholder":127},[58,1372,1373,1376,1378,1380,1383,1386,1389,1392],{"class":60,"line":423},[58,1374,1375],{"class":64},"Receiving",[58,1377,1281],{"class":68},[58,1379,1303],{"class":68},[58,1381,1382],{"class":1306}," (959773/959773), 366.94 MiB ",[58,1384,1385],{"class":255},"|",[58,1387,1388],{"class":64}," 20.87",[58,1390,1391],{"class":68}," MiB/s,",[58,1393,1287],{"class":68},[58,1395,1396],{"class":60,"line":429},[58,1397,128],{"emptyLinePlaceholder":127},[58,1399,1400,1403,1406,1408,1411,1414],{"class":60,"line":434},[58,1401,1402],{"class":64},"Resolving",[58,1404,1405],{"class":68}," deltas:",[58,1407,1303],{"class":68},[58,1409,1410],{"class":1306}," (710976/710976), completed with 9081 ",[58,1412,1413],{"class":255},"local",[58,1415,1416],{"class":1306}," objects.\n",[58,1418,1419],{"class":60,"line":446},[58,1420,128],{"emptyLinePlaceholder":127},[58,1422,1423,1426,1428,1430],{"class":60,"line":451},[58,1424,1425],{"class":64},"Checking",[58,1427,1281],{"class":68},[58,1429,1303],{"class":68},[58,1431,1432],{"class":1306}," (4194304/4194304), done.\n",[58,1434,1435],{"class":60,"line":457},[58,1436,128],{"emptyLinePlaceholder":127},[58,1438,1439,1441,1444,1447],{"class":60,"line":462},[58,1440,1425],{"class":64},[58,1442,1443],{"class":68}," connectivity:",[58,1445,1446],{"class":68}," 959668,",[58,1448,1287],{"class":68},[58,1450,1451],{"class":60,"line":468},[58,1452,128],{"emptyLinePlaceholder":127},[58,1454,1455,1458,1461,1463],{"class":60,"line":473},[58,1456,1457],{"class":64},"Updating",[58,1459,1460],{"class":68}," files:",[58,1462,1303],{"class":68},[58,1464,1465],{"class":1306}," (59972/59972), done.\n",[58,1467,1468],{"class":60,"line":479},[58,1469,128],{"emptyLinePlaceholder":127},[58,1471,1472,1474,1477,1479,1481,1483],{"class":60,"line":484},[58,1473,65],{"class":64},[58,1475,1476],{"class":68}," git-v2.50",[58,1478,1242],{"class":68},[58,1480,1245],{"class":109},[58,1482,1248],{"class":68},[58,1484,1485],{"class":68}," gl-2.50\n",[58,1487,1488],{"class":60,"line":490},[58,1489,128],{"emptyLinePlaceholder":127},[58,1491,1492,1494,1496],{"class":60,"line":495},[58,1493,1260],{"class":64},[58,1495,1263],{"class":68},[58,1497,1498],{"class":68}," 'gl-2.50'...\n",[58,1500,1501],{"class":60,"line":501},[58,1502,128],{"emptyLinePlaceholder":127},[58,1504,1505,1507,1509,1511,1514],{"class":60,"line":506},[58,1506,1275],{"class":64},[58,1508,1278],{"class":68},[58,1510,1281],{"class":68},[58,1512,1513],{"class":68}," 65538,",[58,1515,1287],{"class":68},[58,1517,1518],{"class":60,"line":525},[58,1519,128],{"emptyLinePlaceholder":127},[58,1521,1522,1524,1526,1528,1530],{"class":60,"line":530},[58,1523,1275],{"class":64},[58,1525,1298],{"class":68},[58,1527,1281],{"class":68},[58,1529,1303],{"class":68},[58,1531,1532],{"class":1306}," (56054/56054), done.\n",[58,1534,1535],{"class":60,"line":536},[58,1536,128],{"emptyLinePlaceholder":127},[58,1538,1539,1541,1543,1545,1547],{"class":60,"line":541},[58,1540,1275],{"class":64},[58,1542,1318],{"class":68},[58,1544,1281],{"class":68},[58,1546,1303],{"class":68},[58,1548,1549],{"class":1306}," (28950/28950), done.\n",[58,1551,1552],{"class":60,"line":547},[58,1553,128],{"emptyLinePlaceholder":127},[58,1555,1556,1558,1560,1563,1565,1568,1571,1573,1576,1578,1580,1582],{"class":60,"line":552},[58,1557,1275],{"class":64},[58,1559,1336],{"class":68},[58,1561,1562],{"class":109}," 43877",[58,1564,1342],{"class":1306},[58,1566,1567],{"class":109},"27401",[58,1569,1570],{"class":1306},"), reused 25170 (",[58,1572,1351],{"class":64},[58,1574,1575],{"class":109}," 13546",[58,1577,1357],{"class":1306},[58,1579,1360],{"class":64},[58,1581,1363],{"class":109},[58,1583,1366],{"class":1306},[58,1585,1586],{"class":60,"line":558},[58,1587,128],{"emptyLinePlaceholder":127},[58,1589,1590,1592,1594,1596,1599,1601,1604,1606],{"class":60,"line":563},[58,1591,1375],{"class":64},[58,1593,1281],{"class":68},[58,1595,1303],{"class":68},[58,1597,1598],{"class":1306}," (43877/43877), 40.42 MiB ",[58,1600,1385],{"class":255},[58,1602,1603],{"class":64}," 22.27",[58,1605,1391],{"class":68},[58,1607,1287],{"class":68},[58,1609,1610],{"class":60,"line":569},[58,1611,128],{"emptyLinePlaceholder":127},[58,1613,1614,1616,1618,1620,1623,1625],{"class":60,"line":574},[58,1615,1402],{"class":64},[58,1617,1405],{"class":68},[58,1619,1303],{"class":68},[58,1621,1622],{"class":1306}," (27401/27401), completed with 8564 ",[58,1624,1413],{"class":255},[58,1626,1416],{"class":1306},[58,1628,1629],{"class":60,"line":580},[58,1630,128],{"emptyLinePlaceholder":127},[58,1632,1633,1635,1637,1639],{"class":60,"line":585},[58,1634,1457],{"class":64},[58,1636,1460],{"class":68},[58,1638,1303],{"class":68},[58,1640,1465],{"class":1306},[12,1642,1643],{},"En comparant ces résultats, nous constatons que Git 2.50.0 récupère 43 887 objets (40,42 MiB) après l'extraction de l'archive, tandis que Git 2.49.0 récupère un total de 959 773 objets (366,94 MiB). Git 2.50.0 récupère environ 95 % d'objets en moins et 90 % de données en moins, ce qui est avantageux aussi bien pour le client que le serveur. Le serveur doit traiter beaucoup moins de données à destination du client, et ce dernier doit télécharger et extraire moins de données. Dans l'exemple fourni par Scott, cela a conduit à une accélération de 25 %.",[12,1645,1646,1647,44],{},"Pour en savoir plus, consultez ce ",[16,1648,284],{"href":1649,"rel":1650},"https://lore.kernel.org/git/pull.1897.git.git.1740489585344.gitgitgadget@gmail.com/",[],[12,1652,1653],{},[1114,1654,1655],{},"Cette série de contributions a été fournie par Scott Chacon.",[23,1657,1659],{"id":1658},"en-savoir-plus","En savoir plus",[12,1661,1662,1663,1668,1669,44],{},"Cet article n'a mis en évidence que quelques-unes des contributions apportées par GitLab et la communauté Git pour cette nouvelle version. Vous pouvez approfondir ce sujet en lisant ",[16,1664,1667],{"href":1665,"rel":1666},"https://lore.kernel.org/git/xmqqa5fg9bsz.fsf@gitster.g/",[],"l'annonce officielle"," du projet Git et en consultant ces ",[16,1670,1673],{"href":1671,"rel":1672},"https://about.gitlab.com/blog/tags/git/",[],"ressources",[1675,1676,1677],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}",{"title":54,"searchDepth":124,"depth":124,"links":1679},[1680,1681,1682,1683,1684,1685],{"id":25,"depth":124,"text":26},{"id":294,"depth":124,"text":295},{"id":749,"depth":124,"text":750},{"id":1123,"depth":124,"text":1124},{"id":1187,"depth":124,"text":1188},{"id":1658,"depth":124,"text":1659},"open-source","2025-07-02","Découvrez les contributions de l'équipe Git de GitLab et de la communauté Git, dont git-diff-pairs(1) et git-rev-list(1), pour la mise à jour de références par lot.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,w_1640,h_1000,c_lfill/v1749663087/Blog/Hero%20Images/git3-cover.png",{},"/fr-fr/blog/what-s-new-in-git-2-50-0",{"noIndex":1691,"title":5,"description":1696,"ogTitle":5,"ogDescription":1697,"ogImage":1692},"Découvrez les contributions de l'équipe Git de GitLab et de la communauté Git, dont git-diff-pairs(1) et git-rev-list(1), pour la mise à jour de références par lot.\n\n\n","Découvrez les contributions de l'équipe Git de GitLab et de la communauté Git, dont git-diff-pairs(1) et git-rev-list(1), pour la mise à jour de références par lot.\n","what-s-new-in-git-2-50-0","fr-fr/blog/what-s-new-in-git-2-50-0",[1701,1702,1703],"community","git","open source","BlogPost","YwhECID6GSGmEY1tQYPL40wd8L4vwzEd8o4L5iVELhU",{"logo":1707,"freeTrial":1712,"sales":1717,"login":1722,"items":1727,"search":2054,"minimal":2090,"duo":2109,"switchNav":2118,"pricingDeployment":2129},{"config":1708},{"href":1709,"dataGaName":1710,"dataGaLocation":1711},"/fr-fr/","gitlab logo","header",{"text":1713,"config":1714},"Commencer un essai gratuit",{"href":1715,"dataGaName":1716,"dataGaLocation":1711},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":1718,"config":1719},"Demander une démo",{"href":1720,"dataGaName":1721,"dataGaLocation":1711},"/fr-fr/sales/?contact-topic=request-demo","sales",{"text":1723,"config":1724},"Connexion",{"href":1725,"dataGaName":1726,"dataGaLocation":1711},"https://gitlab.com/users/sign_in/","sign in",[1728,1756,1858,1863,1976,2032],{"text":1729,"config":1730,"menu":1732},"Plateforme",{"dataNavLevelOne":1731},"platform",{"type":1733,"columns":1734},"cards",[1735,1741,1749],{"title":1729,"description":1736,"link":1737},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":1738,"config":1739},"Explorer notre plateforme",{"href":1740,"dataGaName":1731,"dataGaLocation":1711},"/fr-fr/platform/",{"title":1742,"description":1743,"link":1744},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":1745,"config":1746},"Découvrir GitLab Duo",{"href":1747,"dataGaName":1748,"dataGaLocation":1711},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1750,"description":1751,"link":1752},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":1659,"config":1753},{"href":1754,"dataGaName":1755,"dataGaLocation":1711},"/fr-fr/why-gitlab/","why gitlab",{"text":1757,"left":127,"config":1758,"menu":1760},"Produit",{"dataNavLevelOne":1759},"solutions",{"type":1761,"link":1762,"columns":1766,"feature":1837},"lists",{"text":1763,"config":1764},"Voir toutes les solutions",{"href":1765,"dataGaName":1759,"dataGaLocation":1711},"/fr-fr/solutions/",[1767,1792,1815],{"title":1768,"description":1769,"link":1770,"items":1775},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":1771},{"icon":1772,"href":1773,"dataGaName":1774,"dataGaLocation":1711},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[1776,1780,1783,1788],{"text":1777,"config":1778},"CI/CD",{"href":1779,"dataGaLocation":1711,"dataGaName":1777},"/fr-fr/solutions/continuous-integration/",{"text":1742,"config":1781},{"href":1747,"dataGaLocation":1711,"dataGaName":1782},"gitlab duo agent platform - product menu",{"text":1784,"config":1785},"Gestion du code source",{"href":1786,"dataGaLocation":1711,"dataGaName":1787},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":1789,"config":1790},"Livraison de logiciels automatisée",{"href":1773,"dataGaLocation":1711,"dataGaName":1791},"Automated software delivery",{"title":1793,"description":1794,"link":1795,"items":1800},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":1796},{"href":1797,"dataGaName":1798,"dataGaLocation":1711,"icon":1799},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1801,1805,1810],{"text":1802,"config":1803},"Tests de sécurité des applications",{"href":1797,"dataGaName":1804,"dataGaLocation":1711},"Application security testing",{"text":1806,"config":1807},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":1808,"dataGaLocation":1711,"dataGaName":1809},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":1811,"config":1812},"Conformité logicielle",{"href":1813,"dataGaName":1814,"dataGaLocation":1711},"/fr-fr/solutions/software-compliance/","software compliance",{"title":1816,"link":1817,"items":1822},"Mesures",{"config":1818},{"icon":1819,"href":1820,"dataGaName":1821,"dataGaLocation":1711},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[1823,1827,1832],{"text":1824,"config":1825},"Visibilité et mesures",{"href":1820,"dataGaLocation":1711,"dataGaName":1826},"Visibility and Measurement",{"text":1828,"config":1829},"Gestion de la chaîne de valeur",{"href":1830,"dataGaLocation":1711,"dataGaName":1831},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":1833,"config":1834},"Analyses et informations",{"href":1835,"dataGaLocation":1711,"dataGaName":1836},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":1838,"type":1761,"items":1839},"GitLab",[1840,1846,1852],{"text":1841,"config":1842},"Entreprises",{"icon":1843,"href":1844,"dataGaLocation":1711,"dataGaName":1845},"Building","/fr-fr/enterprise/","enterprise",{"text":1847,"config":1848},"Pour les PME",{"icon":1849,"href":1850,"dataGaLocation":1711,"dataGaName":1851},"Work","/fr-fr/small-business/","small business",{"text":1853,"config":1854},"Pour le secteur public",{"icon":1855,"href":1856,"dataGaLocation":1711,"dataGaName":1857},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":1859,"config":1860},"Tarifs",{"href":1861,"dataGaName":1862,"dataGaLocation":1711,"dataNavLevelOne":1862},"/fr-fr/pricing/","pricing",{"text":1864,"config":1865,"menu":1867},"Ressources",{"dataNavLevelOne":1866},"resources",{"type":1761,"link":1868,"columns":1872,"feature":1965},{"text":1869,"config":1870},"Afficher toutes les ressources",{"href":1871,"dataGaName":1866,"dataGaLocation":1711},"/fr-fr/resources/",[1873,1906,1933],{"title":1874,"items":1875},"Premiers pas",[1876,1881,1886,1891,1896,1901],{"text":1877,"config":1878},"Installation",{"href":1879,"dataGaName":1880,"dataGaLocation":1711},"/fr-fr/install/","install",{"text":1882,"config":1883},"Guides de démarrage",{"href":1884,"dataGaName":1885,"dataGaLocation":1711},"/fr-fr/get-started/","quick setup checklists",{"text":1887,"config":1888},"Apprentissage",{"href":1889,"dataGaLocation":1711,"dataGaName":1890},"https://university.gitlab.com/","learn",{"text":1892,"config":1893},"Documentation",{"href":1894,"dataGaName":1895,"dataGaLocation":1711},"https://docs.gitlab.com/","product documentation",{"text":1897,"config":1898},"Vidéos sur les bonnes pratiques",{"href":1899,"dataGaName":1900,"dataGaLocation":1711},"/fr-fr/getting-started-videos/","best practice videos",{"text":1902,"config":1903},"Intégrations",{"href":1904,"dataGaName":1905,"dataGaLocation":1711},"/fr-fr/integrations/","integrations",{"title":1907,"items":1908},"Découvrir",[1909,1914,1919,1924,1928],{"text":1910,"config":1911},"Témoignages clients",{"href":1912,"dataGaName":1913,"dataGaLocation":1711},"/fr-fr/customers/","customer success stories",{"text":1915,"config":1916},"Blog",{"href":1917,"dataGaName":1918,"dataGaLocation":1711},"/fr-fr/blog/","blog",{"text":1920,"config":1921},"Demo Hub",{"href":1922,"dataGaName":1923,"dataGaLocation":1711},"/fr-fr/demo-hub/","demo hub",{"text":1925,"config":1926},"The Source",{"href":1927,"dataGaName":1918,"dataGaLocation":1711},"/fr-fr/the-source/",{"text":1929,"config":1930},"Travail à distance",{"href":1931,"dataGaName":1932,"dataGaLocation":1711},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1934,"items":1935},"Connecter",[1936,1941,1946,1950,1955,1960],{"text":1937,"config":1938},"Services GitLab",{"href":1939,"dataGaName":1940,"dataGaLocation":1711},"/fr-fr/services/","services",{"text":1942,"config":1943},"Contribuer",{"href":1944,"dataGaName":1945,"dataGaLocation":1711},"https://contributors.gitlab.com","contribute",{"text":1947,"config":1948},"Communauté",{"href":1949,"dataGaName":1701,"dataGaLocation":1711},"/community/",{"text":1951,"config":1952},"Forum",{"href":1953,"dataGaName":1954,"dataGaLocation":1711},"https://forum.gitlab.com/","forum",{"text":1956,"config":1957},"Événements",{"href":1958,"dataGaName":1959,"dataGaLocation":1711},"/events/","events",{"text":1961,"config":1962},"Partenaires",{"href":1963,"dataGaName":1964,"dataGaLocation":1711},"/fr-fr/partners/","partners",{"config":1966,"title":1969,"text":1970,"link":1971},{"background":1967,"textColor":1968},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Nouveautés de GitLab","Découvrez les dernières fonctionnalités et améliorations.",{"text":1972,"config":1973},"Lire les articles les plus récents",{"href":1974,"dataGaName":1975,"dataGaLocation":1711},"/fr-fr/whats-new/","whats new",{"text":1977,"config":1978,"menu":1980},"Société",{"dataNavLevelOne":1979},"company",{"type":1761,"columns":1981},[1982],{"items":1983},[1984,1989,1995,1997,2002,2007,2012,2017,2022,2027],{"text":1985,"config":1986},"À propos",{"href":1987,"dataGaName":1988,"dataGaLocation":1711},"/fr-fr/company/","about",{"text":1990,"config":1991,"footerGa":1994},"Carrières",{"href":1992,"dataGaName":1993,"dataGaLocation":1711},"/jobs/","jobs",{"dataGaName":1993},{"text":1956,"config":1996},{"href":1958,"dataGaName":1959,"dataGaLocation":1711},{"text":1998,"config":1999},"Leadership",{"href":2000,"dataGaName":2001,"dataGaLocation":1711},"/company/team/e-group/","leadership",{"text":2003,"config":2004},"Manuel",{"href":2005,"dataGaName":2006,"dataGaLocation":1711},"https://handbook.gitlab.com/","handbook",{"text":2008,"config":2009},"Relations avec les investisseurs",{"href":2010,"dataGaName":2011,"dataGaLocation":1711},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":2013,"config":2014},"Trust Center",{"href":2015,"dataGaName":2016,"dataGaLocation":1711},"/fr-fr/security/","trust center",{"text":2018,"config":2019},"Centre pour la transparence de l'IA",{"href":2020,"dataGaName":2021,"dataGaLocation":1711},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":2023,"config":2024},"Newsletter",{"href":2025,"dataGaName":2026,"dataGaLocation":1711},"/company/contact/#contact-forms","newsletter",{"text":2028,"config":2029},"Presse",{"href":2030,"dataGaName":2031,"dataGaLocation":1711},"/press/","press",{"text":2033,"config":2034,"menu":2035},"Nous contacter",{"dataNavLevelOne":1979},{"type":1761,"columns":2036},[2037],{"items":2038},[2039,2044,2049],{"text":2040,"config":2041},"Contacter l'équipe commerciale",{"href":2042,"dataGaName":2043,"dataGaLocation":1711},"/fr-fr/sales/","talk to sales",{"text":2045,"config":2046},"Assistance GitLab",{"href":2047,"dataGaName":2048,"dataGaLocation":1711},"https://support.gitlab.com/hc/en-us","support portal",{"text":2050,"config":2051},"Portail clients GitLab",{"href":2052,"dataGaName":2053,"dataGaLocation":1711},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":2055,"login":2056,"suggestions":2063},"Fermer",{"text":2057,"link":2058},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":2059,"config":2060},"GitLab.com",{"href":1725,"dataGaName":2061,"dataGaLocation":2062},"search login","search",{"text":2064,"default":2065},"Suggestions",[2066,2069,2074,2076,2081,2086],{"text":1742,"config":2067},{"href":1747,"dataGaName":2068,"dataGaLocation":2062},"GitLab Duo Agent Platform",{"text":2070,"config":2071},"Suggestions de code (IA)",{"href":2072,"dataGaName":2073,"dataGaLocation":2062},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1777,"config":2075},{"href":1779,"dataGaName":1777,"dataGaLocation":2062},{"text":2077,"config":2078},"GitLab sur AWS",{"href":2079,"dataGaName":2080,"dataGaLocation":2062},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":2082,"config":2083},"GitLab sur Google Cloud",{"href":2084,"dataGaName":2085,"dataGaLocation":2062},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":2087,"config":2088},"Pourquoi utiliser GitLab ?",{"href":1754,"dataGaName":2089,"dataGaLocation":2062},"Why GitLab?",{"freeTrial":2091,"mobileIcon":2096,"desktopIcon":2101,"secondaryButton":2104},{"text":2092,"config":2093},"Commencer votre essai gratuit",{"href":2094,"dataGaName":1716,"dataGaLocation":2095},"https://gitlab.com/-/trials/new/","nav",{"altText":2097,"config":2098},"Icône GitLab",{"src":2099,"dataGaName":2100,"dataGaLocation":2095},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":2097,"config":2102},{"src":2103,"dataGaName":2100,"dataGaLocation":2095},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":2105,"config":2106},"Commencer",{"href":2107,"dataGaName":2108,"dataGaLocation":2095},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":2110,"mobileIcon":2114,"desktopIcon":2116},{"text":2111,"config":2112},"En savoir plus sur GitLab Duo",{"href":1747,"dataGaName":2113,"dataGaLocation":2095},"gitlab duo",{"altText":2097,"config":2115},{"src":2099,"dataGaName":2100,"dataGaLocation":2095},{"altText":2097,"config":2117},{"src":2103,"dataGaName":2100,"dataGaLocation":2095},{"button":2119,"mobileIcon":2124,"desktopIcon":2126},{"text":2120,"config":2121},"/switch",{"href":2122,"dataGaName":2123,"dataGaLocation":2095},"#contact","switch",{"altText":2097,"config":2125},{"src":2099,"dataGaName":2100,"dataGaLocation":2095},{"altText":2097,"config":2127},{"src":2128,"dataGaName":2100,"dataGaLocation":2095},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":2130,"mobileIcon":2135,"desktopIcon":2137},{"text":2131,"config":2132},"Retour aux tarifs",{"href":1861,"dataGaName":2133,"dataGaLocation":2095,"icon":2134},"back to pricing","GoBack",{"altText":2097,"config":2136},{"src":2099,"dataGaName":2100,"dataGaLocation":2095},{"altText":2097,"config":2138},{"src":2103,"dataGaName":2100,"dataGaLocation":2095},{"title":2140,"button":2141,"config":2145},"GitLab Orbit est arrivé : la couche de contexte pour les agents d'IA.",{"text":1659,"config":2142},{"href":2143,"dataGaName":2144,"dataGaLocation":1711},"/fr-fr/gitlab-orbit/","orbit",{"layout":2146,"disabled":1691},"release",{"data":2148},{"text":2149,"source":2150,"edit":2156,"contribute":2161,"config":2165,"items":2170,"minimal":2378},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":2151,"config":2152},"Afficher le code source de la page",{"href":2153,"dataGaName":2154,"dataGaLocation":2155},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":2157,"config":2158},"Modifier cette page",{"href":2159,"dataGaName":2160,"dataGaLocation":2155},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1942,"config":2162},{"href":2163,"dataGaName":2164,"dataGaLocation":2155},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":2166,"facebook":2167,"youtube":2168,"linkedin":2169},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[2171,2217,2270,2313,2345],{"title":1859,"links":2172,"subMenu":2187},[2173,2177,2182],{"text":2174,"config":2175},"Voir les forfaits",{"href":1861,"dataGaName":2176,"dataGaLocation":2155},"view plans",{"text":2178,"config":2179},"GitLab Premium",{"href":2180,"dataGaName":2181,"dataGaLocation":2155},"/fr-fr/pricing/premium/","why premium",{"text":2183,"config":2184},"GitLab Ultimate",{"href":2185,"dataGaName":2186,"dataGaLocation":2155},"/fr-fr/pricing/ultimate/","why ultimate",[2188],{"title":2033,"links":2189},[2190,2192,2194,2197,2202,2207,2212],{"text":2040,"config":2191},{"href":2042,"dataGaName":1721,"dataGaLocation":2155},{"text":2045,"config":2193},{"href":2047,"dataGaName":2048,"dataGaLocation":2155},{"text":2195,"config":2196},"Portail clients",{"href":2052,"dataGaName":2053,"dataGaLocation":2155},{"text":2198,"config":2199},"Statut",{"href":2200,"dataGaName":2201,"dataGaLocation":2155},"https://status.gitlab.com/","status",{"text":2203,"config":2204},"Conditions d'utilisation",{"href":2205,"dataGaName":2206,"dataGaLocation":2155},"/terms/","terms of use",{"text":2208,"config":2209},"Politique de confidentialité",{"href":2210,"dataGaName":2211,"dataGaLocation":2155},"/fr-fr/privacy/","privacy statement",{"text":2213,"config":2214},"Gestion des cookies",{"dataGaName":2215,"dataGaLocation":2155,"id":2216,"isOneTrustButton":127},"cookie preferences","ot-sdk-btn",{"title":1757,"links":2218,"subMenu":2227},[2219,2223],{"text":2220,"config":2221},"Plateforme DevSecOps",{"href":1740,"dataGaName":2222,"dataGaLocation":2155},"devsecops platform",{"text":2224,"config":2225},"Développement assisté par l'IA",{"href":1747,"dataGaName":2226,"dataGaLocation":2155},"ai-assisted development",[2228],{"title":2229,"links":2230},"Thèmes",[2231,2235,2240,2245,2250,2255,2260,2265],{"text":1777,"config":2232},{"href":2233,"dataGaName":2234,"dataGaLocation":2155},"/fr-fr/topics/ci-cd/","cicd",{"text":2236,"config":2237},"GitOps",{"href":2238,"dataGaName":2239,"dataGaLocation":2155},"/fr-fr/topics/gitops/","gitops",{"text":2241,"config":2242},"DevOps",{"href":2243,"dataGaName":2244,"dataGaLocation":2155},"/fr-fr/topics/devops/","devops",{"text":2246,"config":2247},"Contrôle de version",{"href":2248,"dataGaName":2249,"dataGaLocation":2155},"/fr-fr/topics/version-control/","version control",{"text":2251,"config":2252},"DevSecOps",{"href":2253,"dataGaName":2254,"dataGaLocation":2155},"/fr-fr/topics/devsecops/","devsecops",{"text":2256,"config":2257},"Cloud-native",{"href":2258,"dataGaName":2259,"dataGaLocation":2155},"/fr-fr/topics/cloud-native/","cloud native",{"text":2261,"config":2262},"IA pour la programmation",{"href":2263,"dataGaName":2264,"dataGaLocation":2155},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":2266,"config":2267},"IA agentique",{"href":2268,"dataGaName":2269,"dataGaLocation":2155},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":2271,"links":2272},"Solutions",[2273,2276,2278,2283,2286,2289,2292,2295,2297,2300,2303,2308],{"text":1802,"config":2274},{"href":1797,"dataGaName":2275,"dataGaLocation":2155},"Application Security Testing",{"text":1789,"config":2277},{"href":1773,"dataGaName":1774,"dataGaLocation":2155},{"text":2279,"config":2280},"Développement Agile",{"href":2281,"dataGaName":2282,"dataGaLocation":2155},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":1784,"config":2284},{"href":1786,"dataGaName":2285,"dataGaLocation":2155},"source code management",{"text":1777,"config":2287},{"href":1779,"dataGaName":2288,"dataGaLocation":2155},"continuous integration & delivery",{"text":1828,"config":2290},{"href":1830,"dataGaName":2291,"dataGaLocation":2155},"value stream management",{"text":2236,"config":2293},{"href":2294,"dataGaName":2239,"dataGaLocation":2155},"/fr-fr/solutions/gitops/",{"text":1841,"config":2296},{"href":1844,"dataGaName":1845,"dataGaLocation":2155},{"text":2298,"config":2299},"PME",{"href":1850,"dataGaName":1851,"dataGaLocation":2155},{"text":2301,"config":2302},"Secteur public",{"href":1856,"dataGaName":1857,"dataGaLocation":2155},{"text":2304,"config":2305},"Éducation",{"href":2306,"dataGaName":2307,"dataGaLocation":2155},"/fr-fr/solutions/education/","education",{"text":2309,"config":2310},"Services financiers",{"href":2311,"dataGaName":2312,"dataGaLocation":2155},"/fr-fr/solutions/finance/","financial services",{"title":1864,"links":2314},[2315,2317,2319,2321,2324,2326,2329,2331,2333,2335,2337,2339,2341,2343],{"text":1877,"config":2316},{"href":1879,"dataGaName":1880,"dataGaLocation":2155},{"text":1882,"config":2318},{"href":1884,"dataGaName":1885,"dataGaLocation":2155},{"text":1887,"config":2320},{"href":1889,"dataGaName":1890,"dataGaLocation":2155},{"text":1892,"config":2322},{"href":1894,"dataGaName":2323,"dataGaLocation":2155},"docs",{"text":1915,"config":2325},{"href":1917,"dataGaName":1918,"dataGaLocation":2155},{"text":2327,"config":2328},"Nouveautés",{"href":1974,"dataGaName":1975,"dataGaLocation":2155},{"text":1910,"config":2330},{"href":1912,"dataGaName":1913,"dataGaLocation":2155},{"text":1929,"config":2332},{"href":1931,"dataGaName":1932,"dataGaLocation":2155},{"text":1937,"config":2334},{"href":1939,"dataGaName":1940,"dataGaLocation":2155},{"text":1942,"config":2336},{"href":1944,"dataGaName":1945,"dataGaLocation":2155},{"text":1947,"config":2338},{"href":1949,"dataGaName":1701,"dataGaLocation":2155},{"text":1951,"config":2340},{"href":1953,"dataGaName":1954,"dataGaLocation":2155},{"text":1956,"config":2342},{"href":1958,"dataGaName":1959,"dataGaLocation":2155},{"text":1961,"config":2344},{"href":1963,"dataGaName":1964,"dataGaLocation":2155},{"title":1977,"links":2346},[2347,2349,2351,2353,2355,2357,2362,2367,2369,2371,2373],{"text":1985,"config":2348},{"href":1987,"dataGaName":1979,"dataGaLocation":2155},{"text":1990,"config":2350},{"href":1992,"dataGaName":1993,"dataGaLocation":2155},{"text":1998,"config":2352},{"href":2000,"dataGaName":2001,"dataGaLocation":2155},{"text":2003,"config":2354},{"href":2005,"dataGaName":2006,"dataGaLocation":2155},{"text":2008,"config":2356},{"href":2010,"dataGaName":2011,"dataGaLocation":2155},{"text":2358,"config":2359},"Développement durable",{"href":2360,"dataGaName":2361,"dataGaLocation":2155},"/sustainability/","Sustainability",{"text":2363,"config":2364},"Diversité, inclusion et appartenance (DIB)",{"href":2365,"dataGaName":2366,"dataGaLocation":2155},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":2013,"config":2368},{"href":2015,"dataGaName":2016,"dataGaLocation":2155},{"text":2023,"config":2370},{"href":2025,"dataGaName":2026,"dataGaLocation":2155},{"text":2028,"config":2372},{"href":2030,"dataGaName":2031,"dataGaLocation":2155},{"text":2374,"config":2375},"Déclaration de transparence sur l'esclavage moderne",{"href":2376,"dataGaName":2377,"dataGaLocation":2155},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2379},[2380,2382,2384],{"text":2203,"config":2381},{"href":2205,"dataGaName":2206,"dataGaLocation":2155},{"text":2213,"config":2383},{"dataGaName":2215,"dataGaLocation":2155,"id":2216,"isOneTrustButton":127},{"text":2208,"config":2385},{"href":2210,"dataGaName":2211,"dataGaLocation":2155},[2387],{"id":2388,"title":7,"body":1690,"config":2389,"content":2391,"description":1690,"extension":2395,"meta":2396,"navigation":127,"path":2397,"seo":2398,"stem":2399,"__hash__":2400},"blogAuthors/en-us/blog/authors/justin-tobler.yml",{"template":2390},"BlogAuthor",{"name":7,"config":2392},{"headshot":2393,"ctfId":2394},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664737/Blog/Author%20Headshots/james_tobler_headshot.png","5pnOIbNI1Sc5IFnReNHNtv","yml",{},"/en-us/blog/authors/justin-tobler",{},"en-us/blog/authors/justin-tobler","fZs0fJVrV3MQT0RHzrMvziLDriL7K4hf9Db4QlPsRvA",[2402,2410,2417],{"title":2403,"description":2404,"heroImage":2405,"category":1686,"date":2406,"authors":2407,"slug":2409,"externalUrl":1690},"Nouveautés de Git 2.55.0","Découvrez les nouveautés de Git 2.55 : commande fixup de git-history(1), daemon fsmonitor pour Linux, push vers des groupes de dépôts distants et plus encore.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1782732487/ztwgrvlolpifo01vj8qc.png","2026-07-01",[2408],"Toon Claes","whats-new-in-git-2-55-0",{"title":2411,"description":2412,"heroImage":2413,"category":1686,"date":2414,"authors":2415,"slug":2416,"externalUrl":1690},"Nouveautés de Git 2.54.0","Découvrez les contributions à cette release de Git 2.54.0, notamment la nouvelle maintenance des dépôts, une nouvelle commande pour modifier l'historique des commits, le remplacement de git-sizer(1) et plus encore.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1776711651/sj7xxyyuimlarswbyft5.png","2026-04-27",[1120],"whats-new-in-git-2-54-0",{"title":2418,"description":2419,"heroImage":2420,"category":1686,"date":2421,"authors":2422,"slug":2424,"externalUrl":1690},"GitLab AI Hackathon 2026 : découvrez les gagnants","Près de 7 000 développeurs ont créé plus de 600 agents et flows d'IA sur GitLab Duo Agent Platform. Découvrez les gagnants et leurs projets.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-22",[2423],"Nick Veenhof","gitlab-ai-hackathon-2026-meet-the-winners",{"promotions":2426},[2427,2441,2453,2465],{"id":2428,"categories":2429,"header":2431,"text":2432,"button":2433,"image":2438},"ai-modernization",[2430],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":2434,"config":2435},"Obtenez votre score de maturité IA",{"href":2436,"dataGaName":2437,"dataGaLocation":1918},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":2439},{"src":2440},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2442,"categories":2443,"header":2445,"text":2432,"button":2446,"image":2450},"devops-modernization",[2444,2254],"product","Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":2447,"config":2448},"Obtenez votre score de maturité DevOps",{"href":2449,"dataGaName":2437,"dataGaLocation":1918},"/fr-fr/assessments/devops-modernization-assessment/",{"config":2451},{"src":2452},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2454,"categories":2455,"header":2457,"text":2432,"button":2458,"image":2462},"security-modernization",[2456],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":2459,"config":2460},"Obtenez votre score de maturité en matière de sécurité",{"href":2461,"dataGaName":2437,"dataGaLocation":1918},"/fr-fr/assessments/security-modernization-assessment/",{"config":2463},{"src":2464},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2466,"paths":2467,"header":2470,"text":2471,"button":2472,"image":2477},"github-azure-migration",[2468,2469],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Votre équipe est-elle prête pour la migration de GitHub vers Azure ?","GitHub a déjà commencé sa migration vers Azure. Découvrez ce que cela signifie pour vous.",{"text":2473,"config":2474},"Découvrez les différences entre GitLab et GitHub",{"href":2475,"dataGaName":2476,"dataGaLocation":1918},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2478},{"src":2452},{"header":2480,"blurb":2481,"button":2482,"secondaryButton":2486},"Commencez à développer plus rapidement dès aujourd'hui","Découvrez ce que votre équipe peut accomplir avec la plateforme d'orchestration intelligente pour le DevSecOps.\n",{"text":1713,"config":2483},{"href":2484,"dataGaName":1716,"dataGaLocation":2485},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":2040,"config":2487},{"href":2042,"dataGaName":1721,"dataGaLocation":2485},1786803785311]