[{"data":1,"prerenderedAt":2250},["ShallowReactive",2],{"/fr-fr/blog/whats-new-in-git-2-52-0":3,"navigation-fr-fr":1444,"banner-fr-fr":1878,"footer-fr-fr":1886,"blog-post-authors-fr-fr-Christian Couder|Toon Claes|Patrick Steinhardt":2125,"blog-related-posts-fr-fr-whats-new-in-git-2-52-0":2164,"blog-promotions-fr-fr":2187,"next-steps-fr-fr":2241},{"id":4,"title":5,"authors":6,"body":10,"category":1424,"date":1425,"description":1426,"extension":1427,"externalUrl":1428,"faq":1428,"featured":1429,"heroImage":1430,"meta":1431,"navigation":273,"path":1432,"seo":1433,"slug":1436,"stem":1437,"tags":1438,"template":1442,"updatedDate":1428,"__hash__":1443},"blogPosts/fr-fr/blog/whats-new-in-git-2-52-0.md","Nouveautés de Git 2.52.0",[7,8,9],"Christian Couder","Toon Claes","Patrick Steinhardt",{"type":11,"value":12,"toc":1412},"minimark",[13,36,41,44,247,254,257,313,316,359,362,372,375,378,552,555,558,586,608,612,629,650,678,681,684,692,708,711,747,750,760,767,776,780,783,790,809,815,824,830,836,863,866,869,878,882,885,888,1158,1161,1170,1174,1177,1182,1194,1207,1211,1218,1235,1307,1319,1323,1350,1370,1382,1386,1392,1395,1408],[14,15,16,17,23,24,29,30,35],"p",{},"Le projet ",[18,19,22],"a",{"href":20,"rel":21},"https://about.gitlab.com/fr-fr/blog/what-is-git/",[],"Git"," a récemment publié ",[18,25,28],{"href":26,"rel":27},"https://lore.kernel.org/git/xmqqh5usmvsd.fsf@gitster.g/",[],"Git 2.52",". Après un cycle de publication relativement court de 8 semaines pour la ",[18,31,34],{"href":32,"rel":33},"https://about.gitlab.com/fr-fr/blog/what-s-new-in-git-2-51-0/",[],"version 2.51",", en raison de l'été dans l'hémisphère nord, cette version revient au cycle habituel de 12 semaines. Passons en revue certaines modifications notables, notamment les contributions de l'équipe Git de GitLab ainsi que de l'ensemble de la communauté Git.",[37,38,40],"h2",{"id":39},"nouvelle-commande-git-last-modified1","Nouvelle commande git-last-modified(1)",[14,42,43],{},"De nombreuses forges Git comme GitLab affichent les fichiers dans une vue arborescente comme celle-ci :",[45,46,47,63],"table",{},[48,49,50],"thead",{},[51,52,53,57,60],"tr",{},[54,55,56],"th",{},"Nom",[54,58,59],{},"Dernier commit",[54,61,62],{},"Dernière mise à jour",[64,65,66,78,89,100,111,120,131,146,156,165,175,185,196,207,218,229],"tbody",{},[51,67,68,72,75],{},[69,70,71],"td",{},"README.md",[69,73,74],{},"README: *.txt -> *.adoc fixes",[69,76,77],{},"Il y a 4 mois",[51,79,80,83,86],{},[69,81,82],{},"RelNotes",[69,84,85],{},"Start 2.51 cycle, the first batch",[69,87,88],{},"Il y a 4 semaines",[51,90,91,94,97],{},[69,92,93],{},"SECURITY.md",[69,95,96],{},"SECURITY: describe how to report vulnerabilities",[69,98,99],{},"Il y a 4 ans",[51,101,102,105,108],{},[69,103,104],{},"abspath.c",[69,106,107],{},"abspath: move related functions to abspath",[69,109,110],{},"Il y a 2 ans",[51,112,113,116,118],{},[69,114,115],{},"abspath.h",[69,117,107],{},[69,119,110],{},[51,121,122,125,128],{},[69,123,124],{},"aclocal.m4",[69,126,127],{},"configure: use AC_LANG_PROGRAM consistently",[69,129,130],{},"Il y a 15 ans",[51,132,133,136,143],{},[69,134,135],{},"add-patch.c",[69,137,138,139],{},"pager: stop using ",[140,141,142],"code",{},"the_repository",[69,144,145],{},"Il y a 7 mois",[51,147,148,151,154],{},[69,149,150],{},"advice.c",[69,152,153],{},"advice: allow disabling default branch name advice",[69,155,77],{},[51,157,158,161,163],{},[69,159,160],{},"advice.h",[69,162,153],{},[69,164,77],{},[51,166,167,170,173],{},[69,168,169],{},"alias.h",[69,171,172],{},"rebase -m: fix serialization of strategy options",[69,174,110],{},[51,176,177,180,183],{},[69,178,179],{},"alloc.h",[69,181,182],{},"git-compat-util: move alloc macros to git-compat-util.h",[69,184,110],{},[51,186,187,190,193],{},[69,188,189],{},"apply.c",[69,191,192],{},"apply: only write intents to add for new files",[69,194,195],{},"Il y a 8 jours",[51,197,198,201,204],{},[69,199,200],{},"archive.c",[69,202,203],{},"Merge branch 'ps/parse-options-integers'",[69,205,206],{},"Il y a 3 mois",[51,208,209,212,215],{},[69,210,211],{},"archive.h",[69,213,214],{},"archive.h: remove unnecessary include",[69,216,217],{},"Il y a 1 an",[51,219,220,223,226],{},[69,221,222],{},"attr.h",[69,224,225],{},"fuzz: port fuzz-parse-attr-line from OSS-Fuzz",[69,227,228],{},"Il y a 9 mois",[51,230,231,234,245],{},[69,232,233],{},"banned.h",[69,235,236,237,240,241,244],{},"banned.h: mark ",[140,238,239],{},"strtok()"," and ",[140,242,243],{},"strtok_r()"," as banned",[69,246,110],{},[14,248,249,252],{},[250,251],"br",{},[250,253],{},[14,255,256],{},"Outre les fichiers eux-mêmes, nous affichons également le dernier commit qui a modifié chaque fichier. Cette information est facile à extraire de Git en exécutant la commande suivante :",[258,259,264],"pre",{"className":260,"code":261,"language":262,"meta":263,"style":263},"language-shell shiki shiki-themes github-light","\n$ git log --max-count=1 HEAD -- \u003Cfilename>\n\n","shell","",[140,265,266,275],{"__ignoreMap":263},[267,268,271],"span",{"class":269,"line":270},"line",1,[267,272,274],{"emptyLinePlaceholder":273},true,"\n",[267,276,278,282,286,289,293,296,299,303,306,310],{"class":269,"line":277},2,[267,279,281],{"class":280},"s7eDp","$",[267,283,285],{"class":284},"sYBdl"," git",[267,287,288],{"class":284}," log",[267,290,292],{"class":291},"sYu0t"," --max-count=1",[267,294,295],{"class":284}," HEAD",[267,297,298],{"class":291}," --",[267,300,302],{"class":301},"sD7c4"," \u003C",[267,304,305],{"class":284},"filenam",[267,307,309],{"class":308},"sgsFI","e",[267,311,312],{"class":301},">\n",[14,314,315],{},"Bien que simple et pratique, cette approche présente une limitation importante : Git ne dispose pas d'un moyen d'extraire cette information pour chacun de ces fichiers en une seule commande. Ainsi, pour obtenir le dernier commit de tous les fichiers de l'arborescence, il faut exécuter cette commande pour chaque fichier séparément, ce qui donne un pipeline similaire à celui-ci :",[258,317,319],{"className":260,"code":318,"language":262,"meta":263,"style":263},"\n$ git ls-tree HEAD --name-only | xargs --max-args=1 git log --max-count=1 HEAD --\n\n",[140,320,321,325],{"__ignoreMap":263},[267,322,323],{"class":269,"line":270},[267,324,274],{"emptyLinePlaceholder":273},[267,326,327,329,331,334,336,339,342,345,348,350,352,354,356],{"class":269,"line":277},[267,328,281],{"class":280},[267,330,285],{"class":284},[267,332,333],{"class":284}," ls-tree",[267,335,295],{"class":284},[267,337,338],{"class":291}," --name-only",[267,340,341],{"class":301}," |",[267,343,344],{"class":280}," xargs",[267,346,347],{"class":291}," --max-args=1",[267,349,285],{"class":284},[267,351,288],{"class":284},[267,353,292],{"class":291},[267,355,295],{"class":284},[267,357,358],{"class":291}," --\n",[14,360,361],{},"Néanmoins, cette approche n'est pas très efficace :",[363,364,365,369],"ul",{},[366,367,368],"li",{},"Il est nécessaire de lancer une nouvelle commande Git pour chaque fichier.",[366,370,371],{},"Git doit parcourir l'historique de chaque fichier séparément.",[14,373,374],{},"En conséquence, cette opération complète est assez coûteuse et génère une charge importante pour GitLab.",[14,376,377],{},"Pour répondre à ces défis, une nouvelle sous-commande Git, git-last-modified(1), a été introduite. Elle indique le dernier commit pour chaque fichier d'un commit donné :",[258,379,381],{"className":260,"code":380,"language":262,"meta":263,"style":263},"\n$ git last-modified HEAD\n\n\ne56f6dcd7b4c90192018e848d0810f091d092913        add-patch.c\n373ad8917beb99dc643b6e7f5c117a294384a57e        advice.h\ne9330ae4b820147c98e723399e9438c8bee60a80        advice.c\n5e2feb5ca692c5c4d39b11e1ffa056911dd7dfd3        alloc.h\n954d33a9757fcfab723a824116902f1eb16e05f7        RelNotes\n4ce0caa7cc27d50ee1bedf1dff03f13be4c54c1f        apply.c\n5d215a7b3eb0a9a69c0cb9aa43dcae956a0aa03e        archive.c\nc50fbb2dd225e7e82abba4380423ae105089f4d7        README.md\n72686d4e5e9a7236b9716368d86fae5bf1ae6156        attr.h\nc2c4138c07ca4d5ffc41ace0bfda0f189d3e262e        archive.h\n5d1344b4973c8ea4904005f3bb51a47334ebb370        abspath.c\n5d1344b4973c8ea4904005f3bb51a47334ebb370        abspath.h\n60ff56f50372c1498718938ef504e744fe011ffb        banned.h\n4960e5c7bdd399e791353bc6c551f09298746f61        alias.h\n2e99b1e383d2da56c81d7ab7dd849e9dab5b7bf0        SECURITY.md\n1e58dba142c673c59fbb9d10aeecf62217d4fc9c        aclocal.m4\n",[140,382,383,387,399,404,409,418,427,436,445,454,463,472,481,490,499,508,516,525,534,543],{"__ignoreMap":263},[267,384,385],{"class":269,"line":270},[267,386,274],{"emptyLinePlaceholder":273},[267,388,389,391,393,396],{"class":269,"line":277},[267,390,281],{"class":280},[267,392,285],{"class":284},[267,394,395],{"class":284}," last-modified",[267,397,398],{"class":284}," HEAD\n",[267,400,402],{"class":269,"line":401},3,[267,403,274],{"emptyLinePlaceholder":273},[267,405,407],{"class":269,"line":406},4,[267,408,274],{"emptyLinePlaceholder":273},[267,410,412,415],{"class":269,"line":411},5,[267,413,414],{"class":280},"e56f6dcd7b4c90192018e848d0810f091d092913",[267,416,417],{"class":284},"        add-patch.c\n",[267,419,421,424],{"class":269,"line":420},6,[267,422,423],{"class":280},"373ad8917beb99dc643b6e7f5c117a294384a57e",[267,425,426],{"class":284},"        advice.h\n",[267,428,430,433],{"class":269,"line":429},7,[267,431,432],{"class":280},"e9330ae4b820147c98e723399e9438c8bee60a80",[267,434,435],{"class":284},"        advice.c\n",[267,437,439,442],{"class":269,"line":438},8,[267,440,441],{"class":280},"5e2feb5ca692c5c4d39b11e1ffa056911dd7dfd3",[267,443,444],{"class":284},"        alloc.h\n",[267,446,448,451],{"class":269,"line":447},9,[267,449,450],{"class":280},"954d33a9757fcfab723a824116902f1eb16e05f7",[267,452,453],{"class":284},"        RelNotes\n",[267,455,457,460],{"class":269,"line":456},10,[267,458,459],{"class":280},"4ce0caa7cc27d50ee1bedf1dff03f13be4c54c1f",[267,461,462],{"class":284},"        apply.c\n",[267,464,466,469],{"class":269,"line":465},11,[267,467,468],{"class":280},"5d215a7b3eb0a9a69c0cb9aa43dcae956a0aa03e",[267,470,471],{"class":284},"        archive.c\n",[267,473,475,478],{"class":269,"line":474},12,[267,476,477],{"class":280},"c50fbb2dd225e7e82abba4380423ae105089f4d7",[267,479,480],{"class":284},"        README.md\n",[267,482,484,487],{"class":269,"line":483},13,[267,485,486],{"class":280},"72686d4e5e9a7236b9716368d86fae5bf1ae6156",[267,488,489],{"class":284},"        attr.h\n",[267,491,493,496],{"class":269,"line":492},14,[267,494,495],{"class":280},"c2c4138c07ca4d5ffc41ace0bfda0f189d3e262e",[267,497,498],{"class":284},"        archive.h\n",[267,500,502,505],{"class":269,"line":501},15,[267,503,504],{"class":280},"5d1344b4973c8ea4904005f3bb51a47334ebb370",[267,506,507],{"class":284},"        abspath.c\n",[267,509,511,513],{"class":269,"line":510},16,[267,512,504],{"class":280},[267,514,515],{"class":284},"        abspath.h\n",[267,517,519,522],{"class":269,"line":518},17,[267,520,521],{"class":280},"60ff56f50372c1498718938ef504e744fe011ffb",[267,523,524],{"class":284},"        banned.h\n",[267,526,528,531],{"class":269,"line":527},18,[267,529,530],{"class":280},"4960e5c7bdd399e791353bc6c551f09298746f61",[267,532,533],{"class":284},"        alias.h\n",[267,535,537,540],{"class":269,"line":536},19,[267,538,539],{"class":280},"2e99b1e383d2da56c81d7ab7dd849e9dab5b7bf0",[267,541,542],{"class":284},"        SECURITY.md\n",[267,544,546,549],{"class":269,"line":545},20,[267,547,548],{"class":280},"1e58dba142c673c59fbb9d10aeecf62217d4fc9c",[267,550,551],{"class":284},"        aclocal.m4\n",[14,553,554],{},"L'avantage de cette approche est évident : nous n'avons plus besoin d'exécuter qu'un seul processus Git pour obtenir toutes ces informations. Mais plus important encore, Git ne doit parcourir l'historique qu'une seule fois pour tous les fichiers.",[14,556,557],{},"Voici comment faire :",[559,560,561,564,575],"ol",{},[366,562,563],{},"Commencez à parcourir l'historique depuis le commit souhaité.",[366,565,566,567],{},"Pour chaque commit :\n",[559,568,569,572],{},[366,570,571],{},"S'il ne modifie aucun des chemins d'accès qui nous intéressent, continuez au commit suivant.",[366,573,574],{},"En cas de chemins d'accès modifiés, affichez l'identifiant du commit avec le chemin, puis retirez le chemin de l'ensemble des chemins.",[366,576,577,578,581,582,585],{},"Arrêtez-vous lorsque la liste des chemins est vide.\nGitaly a déjà été adapté pour utiliser la nouvelle commande, mais la logique est encore protégée par un feature flag. Des tests préliminaires ont montré que dans la plupart des situations, ",[140,579,580],{},"git-last-modified(1)"," est au moins deux fois plus rapide que ",[140,583,584],{},"git log --max-count=1",".",[14,587,588],{},[589,590,591,592,597,598,603,604,585],"em",{},"Ces modifications ont été ",[18,593,596],{"href":594,"rel":595},"https://github.com/ttaylorr/git/tree/tb/blame-tree",[],"écrites à l'origine"," par plusieurs développeurs de GitHub et ont été ",[18,599,602],{"href":600,"rel":601},"https://lore.kernel.org/git/20250805093358.1791633-1-toon@iotcl.com/",[],"intégrées en amont"," dans Git par ",[18,605,8],{"href":606,"rel":607},"https://gitlab.com/toon",[],[37,609,611],{"id":610},"améliorations-liées-aux-signatures-pour-git-fast-export1-et-git-fast-import1","Améliorations liées aux signatures pour git-fast-export(1) et git-fast-import(1)",[14,613,614,615,618,619,622,623,628],{},"Les commandes ",[140,616,617],{},"git-fast-export(1)"," et ",[140,620,621],{},"git-fast-import(1)"," sont conçues pour être principalement utilisées par des outils d'interopérabilité ou de réécriture d'historique. Les outils d'interopérabilité ont pour objectif d'assurer des interactions harmonieuses entre Git et un autre logiciel, le plus souvent un système de contrôle de version qui stocke les données dans un format différent de Git. Par exemple, ",[18,624,627],{"href":625,"rel":626},"https://github.com/frej/fast-export",[],"hg-fast-export.sh"," est un « convertisseur Mercurial vers Git utilisant git-fast-import ».",[14,630,631,632,637,638,643,644,649],{},"Les outils de réécriture d'historique permettent aux utilisateurs, généralement des administrateurs, d'apporter des modifications à l'historique de leurs dépôts qui ne sont pas possibles ou pas autorisées par le système de ",[18,633,636],{"href":634,"rel":635},"https://about.gitlab.com/fr-fr/topics/version-control/",[],"contrôle de version",". Par exemple, ",[18,639,642],{"href":640,"rel":641},"http://www.catb.org/esr/reposurgeon/",[],"reposurgeon"," indique dans son ",[18,645,648],{"href":646,"rel":647},"https://gitlab.com/esr/reposurgeon/-/blob/master/repository-editing.adoc?ref_type=heads#introduction",[],"introduction"," que son objectif est « de permettre des opérations risquées que les systèmes de contrôle de version n'autorisent pas comme (a) modifier des commentaires et métadonnées passés, (b) supprimer des commits, (c) fusionner et diviser des commits, (d) supprimer des fichiers et sous-arbres de l'historique du dépôt, (e) fusionner ou greffer deux dépôts ou davantage et (f) diviser un dépôt en deux en dissociant une relation parent-enfant et en préservant la structure des branches des deux dépôts enfants ».",[14,651,652,653,658,659,664,665,667,668,670,671,673,674,677],{},"Au sein de GitLab, nous utilisons ",[18,654,657],{"href":655,"rel":656},"https://github.com/newren/git-filter-repo",[],"git-filter-repo"," pour autoriser les administrateurs à effectuer certaines opérations risquées sur leurs dépôts Git. Malheureusement, jusqu'à la ",[18,660,663],{"href":661,"rel":662},"https://about.gitlab.com/fr-fr/blog/what-s-new-in-git-2-50-0/",[],"version Git 2.50"," publiée en juin dernier, ni ",[140,666,617],{}," ni ",[140,669,621],{}," ne prenaient en charge les signatures cryptographiques de commits. Bien que ",[140,672,617],{}," ait une option ",[140,675,676],{},"--signed-tags=\u003Cmode>"," qui permette aux utilisateurs de modifier la façon dont les signatures cryptographiques de tags sont gérées, les signatures de commits étaient simplement ignorées.",[14,679,680],{},"Les signatures cryptographiques sont très fragiles, car elles sont basées sur les données exactes du commit ou du tag qui ont été signées. Lorsque les données signées ou l'historique qui les précède changent, la signature cryptographique devient invalide. C'est une exigence fragile mais qui rend ces signatures utiles.",[14,682,683],{},"Dans le contexte de la réécriture d'historique, cette approche devient problématique :",[363,685,686,689],{},[366,687,688],{},"Nous pourrions vouloir conserver les signatures cryptographiques pour les commits et les tags toujours valides après la réécriture (par exemple, parce que l'historique n'a pas changé).",[366,690,691],{},"Nous pourrions vouloir créer de nouvelles signatures cryptographiques pour les commits et les tags dont la signature précédente est désormais invalide.",[14,693,694,695,667,697,699,700,703,704,707],{},"Cependant, ni ",[140,696,621],{},[140,698,617],{}," ne prennent en charge ces cas d'utilisation, ce que des outils comme ",[18,701,657],{"href":655,"rel":702},[]," ou ",[18,705,642],{"href":640,"rel":706},[]," ne peuvent accomplir.",[14,709,710],{},"Voici les progrès significatifs réalisés :",[363,712,713,726,737],{},[366,714,715,716,719,720,722,723,725],{},"Dans la version Git 2.50, nous avons ajouté une option ",[140,717,718],{},"--signed-commits=\u003Cmode>"," à ",[140,721,617],{}," pour exporter les signatures de commits, et une prise en charge dans ",[140,724,621],{}," pour les importer.",[366,727,728,729,733,734,736],{},"Dans la ",[18,730,732],{"href":32,"rel":731},[],"version Git 2.51",", nous avons amélioré le format utilisé pour exporter et importer les signatures de commits et modifié ",[140,735,621],{}," afin que la commande puisse importer à la fois une signature sur l'ID d'objet SHA-1 du commit et une sur son ID d'objet SHA-256.",[366,738,739,740,618,742,719,744,746],{},"Dans la version Git 2.52, nous avons ajouté les options ",[140,741,718],{},[140,743,676],{},[140,745,621],{},", afin que l'utilisateur puisse contrôler la gestion des données signées au moment de l'importation.",[14,748,749],{},"Le travail n'est pas encore terminé. Nous devons encore ajouter les fonctionnalités suivantes :",[363,751,752,757],{},[366,753,754,755,585],{},"Conserver uniquement les signatures de commits qui sont toujours valides dans ",[140,756,621],{},[366,758,759],{},"Signer à nouveau les données dont la signature est devenue invalide.",[14,761,762,763,766],{},"Nous avons déjà commencé à travailler sur ces prochaines étapes, qui devraient être intégrées à Git 2.53. Une fois ces fonctionnalités disponibles, des outils comme ",[140,764,765],{},"git-filter-repo(1)"," pourront enfin mieux gérer les signatures cryptographiques. Nous vous tiendrons informés dans notre prochain article de blog consacré à la sortie de version Git.",[14,768,769],{},[589,770,771,772,585],{},"Ce projet a été mené par ",[18,773,7],{"href":774,"rel":775},"https://gitlab.com/chriscool",[],[37,777,779],{"id":778},"améliorations-des-stratégies-git-maintenance1","Améliorations des stratégies git-maintenance(1)",[14,781,782],{},"Les dépôts Git nécessitent une maintenance régulière pour garantir de bonnes performances. Lors de cette opération, les références sont optimisées, les objets compressés et les données obsolètes éliminées.",[14,784,785,786,789],{},"Jusqu'à la version Git 2.28, ces tâches de maintenance étaient effectuées par ",[140,787,788],{},"git-gc(1)",". Néanmoins, cette commande n'a pas été conçue dans un esprit de personnalisation : bien que certains paramètres puissent être configurés, il n'est pas possible de contrôler les parties d'un dépôt à optimiser. Elle ne convient donc pas à tous les cas d'utilisation. Plus important encore, il est très difficile d'itérer sur la façon dont Git effectue la maintenance du dépôt.",[14,791,792,793,798,799,802,803,805,806,808],{},"Pour résoudre ce problème et itérer à nouveau, ",[18,794,797],{"href":795,"rel":796},"https://github.com/derrickstolee",[],"Derrick Stolee"," a déployé ",[140,800,801],{},"git-maintenance(1)",". Contrairement à ",[140,804,788],{},", cette commande a été conçue pour être personnalisable et permet à l'utilisateur de configurer les tâches spécifiques qui doivent s'exécuter dans un certain dépôt. Ce nouvel outil est devenu l'outil par défaut pour la maintenance automatisée de Git dans la version Git 2.29, mais, par défaut, il utilise toujours ",[140,807,788],{}," pour effectuer la maintenance.",[14,810,811,812,814],{},"Bien que cette stratégie de maintenance par défaut fonctionne bien pour les dépôts de petite taille ou même de taille moyenne, elle se révèle problématique dans le contexte de grands monorepos. Le principal facteur limitant est la façon dont ",[140,813,788],{}," rempaquette les objets : dès que le nombre de fichiers d'empaquetage (« packfiles ») dépasse les 50, l'outil les fusionne en un seul fichier. Cette opération gourmande en CPU provoque de nombreuses opérations d'E/S et peut facilement prendre plusieurs minutes, voire des heures pour les grands monorepos.",[14,816,817,818,823],{},"Git sait déjà comment minimiser ces rempaquetages via le « rempaquetage géométrique ». L'idée est simple : les fichiers d'empaquetage du dépôt doivent suivre une progression géométrique, c'est-à-dire que chaque fichier doit contenir au moins deux fois plus d'objets que le fichier suivant plus petit. Git peut ainsi amortir le nombre de rempaquetages requis et garantir une quantité relativement limitée de fichiers d'empaquetage. Ce mode a été introduit par ",[18,819,822],{"href":820,"rel":821},"https://github.com/ttaylorr",[],"Taylor Blau"," dans la version Git 2.32, mais il n'était pas intégré dans la maintenance automatisée.",[14,825,826,827,829],{},"Tous les éléments existants servent à faciliter la mise à l'échelle de la maintenance du dépôt pour les grands monorepos : l'outil flexible ",[140,828,801],{}," peut être étendu pour intégrer une nouvelle stratégie de maintenance, et nous disposons d'une meilleure méthode pour rempaqueter les objets. Il ne reste plus qu'à combiner ces deux éléments.",[14,831,832,833,835],{},"Et c'est exactement ce que nous avons fait dans la version Git 2.52. La nouvelle stratégie de maintenance « géométrique » peut être configurée dans vos dépôts Git et est destinée à remplacer complètement l'ancienne stratégie basée sur ",[140,834,788],{},". Voici le code de configuration dont vous avez besoin :",[258,837,839],{"className":260,"code":838,"language":262,"meta":263,"style":263},"\n$ git config set maintenance.strategy geometric\n\n",[140,840,841,845],{"__ignoreMap":263},[267,842,843],{"class":269,"line":270},[267,844,274],{"emptyLinePlaceholder":273},[267,846,847,849,851,854,857,860],{"class":269,"line":277},[267,848,281],{"class":280},[267,850,285],{"class":284},[267,852,853],{"class":284}," config",[267,855,856],{"class":284}," set",[267,858,859],{"class":284}," maintenance.strategy",[267,861,862],{"class":284}," geometric\n",[14,864,865],{},"À partir de maintenant, Git utilisera le rempaquetage géométrique afin d'optimiser vos objets. Résultat : un taux d'attrition plus faible et une optimisation de l'état de vos objets, en particulier dans les grands monorepos.",[14,867,868],{},"Dans Git 2.53, nous prévoyons d'en faire la stratégie par défaut.",[14,870,871],{},[589,872,873,874,585],{},"Ce projet a été dirigé par ",[18,875,9],{"href":876,"rel":877},"https://gitlab.com/pks-gitlab",[],[37,879,881],{"id":880},"nouvelle-sous-commande-pour-git-repo1-afin-dafficher-les-métriques-du-dépôt","Nouvelle sous-commande pour git-repo(1) afin d'afficher les métriques du dépôt",[14,883,884],{},"Les performances des opérations Git dans un dépôt dépendent souvent de certaines caractéristiques de sa structure sous-jacente. Chez GitLab, nous hébergeons des dépôts extrêmement volumineux, et il est essentiel d'avoir un aperçu de la structure générale d'un dépôt pour comprendre ses performances. Bien qu'il soit possible de combiner diverses commandes Git et d'autres outils pour obtenir certaines métriques du dépôt, il est impossible d'afficher des informations sur la forme/structure d'un dépôt via une seule commande dans Git. Pour combler cette lacune, des outils externes comme git-sizer(1) ont été développés.",[14,886,887],{},"Avec la sortie de Git 2.52, une nouvelle sous-commande « structure » a été ajoutée à git-repo(1) dans le but d'afficher des informations sur la structure d'un dépôt. Actuellement, elle indique le nombre de références et d'objets dans le dépôt sous la forme suivante :",[258,889,891],{"className":260,"code":890,"language":262,"meta":263,"style":263},"\n$ git repo structure\n\n\n| Repository structure | Value  |\n| -------------------- | ------ |\n| * References         |        |\n|   * Count            |   1772 |\n|     * Branches       |      3 |\n|     * Tags           |   1025 |\n|     * Remotes        |    744 |\n|     * Others         |      0 |\n|                      |        |\n| * Reachable objects  |        |\n|   * Count            | 418958 |\n|     * Commits        |  87468 |\n|     * Trees          | 168866 |\n|     * Blobs          | 161632 |\n|     * Tags           |    992 |\n\n",[140,892,893,897,909,913,917,936,951,967,985,1003,1020,1037,1053,1062,1079,1094,1110,1127,1143],{"__ignoreMap":263},[267,894,895],{"class":269,"line":270},[267,896,274],{"emptyLinePlaceholder":273},[267,898,899,901,903,906],{"class":269,"line":277},[267,900,281],{"class":280},[267,902,285],{"class":284},[267,904,905],{"class":284}," repo",[267,907,908],{"class":284}," structure\n",[267,910,911],{"class":269,"line":401},[267,912,274],{"emptyLinePlaceholder":273},[267,914,915],{"class":269,"line":406},[267,916,274],{"emptyLinePlaceholder":273},[267,918,919,922,925,928,930,933],{"class":269,"line":411},[267,920,921],{"class":301},"|",[267,923,924],{"class":280}," Repository",[267,926,927],{"class":284}," structure",[267,929,341],{"class":301},[267,931,932],{"class":280}," Value",[267,934,935],{"class":301},"  |\n",[267,937,938,940,943,945,948],{"class":269,"line":420},[267,939,921],{"class":301},[267,941,942],{"class":280}," --------------------",[267,944,341],{"class":301},[267,946,947],{"class":280}," ------",[267,949,950],{"class":301}," |\n",[267,952,953,955,958,961,964],{"class":269,"line":429},[267,954,921],{"class":301},[267,956,957],{"class":280}," *",[267,959,960],{"class":284}," References",[267,962,963],{"class":301},"         |",[267,965,966],{"class":301},"        |\n",[267,968,969,971,974,977,980,983],{"class":269,"line":438},[267,970,921],{"class":301},[267,972,973],{"class":280},"   *",[267,975,976],{"class":284}," Count",[267,978,979],{"class":301},"            |",[267,981,982],{"class":280},"   1772",[267,984,950],{"class":301},[267,986,987,989,992,995,998,1001],{"class":269,"line":447},[267,988,921],{"class":301},[267,990,991],{"class":280},"     *",[267,993,994],{"class":284}," Branches",[267,996,997],{"class":301},"       |",[267,999,1000],{"class":280},"      3",[267,1002,950],{"class":301},[267,1004,1005,1007,1009,1012,1015,1018],{"class":269,"line":456},[267,1006,921],{"class":301},[267,1008,991],{"class":280},[267,1010,1011],{"class":284}," Tags",[267,1013,1014],{"class":301},"           |",[267,1016,1017],{"class":280},"   1025",[267,1019,950],{"class":301},[267,1021,1022,1024,1026,1029,1032,1035],{"class":269,"line":465},[267,1023,921],{"class":301},[267,1025,991],{"class":280},[267,1027,1028],{"class":284}," Remotes",[267,1030,1031],{"class":301},"        |",[267,1033,1034],{"class":280},"    744",[267,1036,950],{"class":301},[267,1038,1039,1041,1043,1046,1048,1051],{"class":269,"line":474},[267,1040,921],{"class":301},[267,1042,991],{"class":280},[267,1044,1045],{"class":284}," Others",[267,1047,963],{"class":301},[267,1049,1050],{"class":280},"      0",[267,1052,950],{"class":301},[267,1054,1055,1057,1060],{"class":269,"line":483},[267,1056,921],{"class":301},[267,1058,1059],{"class":301},"                      |",[267,1061,966],{"class":301},[267,1063,1064,1066,1068,1071,1074,1077],{"class":269,"line":492},[267,1065,921],{"class":301},[267,1067,957],{"class":280},[267,1069,1070],{"class":284}," Reachable",[267,1072,1073],{"class":284}," objects",[267,1075,1076],{"class":301},"  |",[267,1078,966],{"class":301},[267,1080,1081,1083,1085,1087,1089,1092],{"class":269,"line":501},[267,1082,921],{"class":301},[267,1084,973],{"class":280},[267,1086,976],{"class":284},[267,1088,979],{"class":301},[267,1090,1091],{"class":280}," 418958",[267,1093,950],{"class":301},[267,1095,1096,1098,1100,1103,1105,1108],{"class":269,"line":510},[267,1097,921],{"class":301},[267,1099,991],{"class":280},[267,1101,1102],{"class":284}," Commits",[267,1104,1031],{"class":301},[267,1106,1107],{"class":280},"  87468",[267,1109,950],{"class":301},[267,1111,1112,1114,1116,1119,1122,1125],{"class":269,"line":518},[267,1113,921],{"class":301},[267,1115,991],{"class":280},[267,1117,1118],{"class":284}," Trees",[267,1120,1121],{"class":301},"          |",[267,1123,1124],{"class":280}," 168866",[267,1126,950],{"class":301},[267,1128,1129,1131,1133,1136,1138,1141],{"class":269,"line":527},[267,1130,921],{"class":301},[267,1132,991],{"class":280},[267,1134,1135],{"class":284}," Blobs",[267,1137,1121],{"class":301},[267,1139,1140],{"class":280}," 161632",[267,1142,950],{"class":301},[267,1144,1145,1147,1149,1151,1153,1156],{"class":269,"line":536},[267,1146,921],{"class":301},[267,1148,991],{"class":280},[267,1150,1011],{"class":284},[267,1152,1014],{"class":301},[267,1154,1155],{"class":280},"    992",[267,1157,950],{"class":301},[14,1159,1160],{},"Dans les versions ultérieures, nous espérons enrichir cette commande et fournir d'autres points de données intéressants comme les objets les plus volumineux du dépôt.",[14,1162,1163],{},[589,1164,771,1165,585],{},[18,1166,1169],{"href":1167,"rel":1168},"https://gitlab.com/justintobler",[],"Justin Tobler",[37,1171,1173],{"id":1172},"améliorations-liées-au-google-summer-of-code-2025","Améliorations liées au Google Summer of Code 2025",[14,1175,1176],{},"Nous avons mené trois projets avec succès au cours du Google Summer of Code.",[1178,1179,1181],"h3",{"id":1180},"refactorisation-pour-réduire-létat-global-de-git","Refactorisation pour réduire l'état global de Git",[14,1183,1184,1185,1190,1191,1193],{},"Git contient plusieurs variables globales utilisées dans tout le code source qui augmentent la complexité du code et réduisent sa maintenabilité. Dans le cadre de ce projet, ",[18,1186,1189],{"href":1187,"rel":1188},"https://ayu-ch.github.io/",[],"Ayush Chandekar"," a réduit l'utilisation de la variable globale ",[140,1192,142],{}," via une série de correctifs.",[14,1195,1196],{},[589,1197,1198,1199,618,1202,585],{},"Le projet a été encadré par ",[18,1200,7],{"href":774,"rel":1201},[],[18,1203,1206],{"href":1204,"rel":1205},"https://in.linkedin.com/in/ghanshyam-thakkar",[],"Ghanshyam Thakkar",[1178,1208,1210],{"id":1209},"outil-de-requête-dinformations-lisibles-par-machine-sur-le-dépôt","Outil de requête d'informations lisibles par machine sur le dépôt",[14,1212,1213,1214,1217],{},"Git manque d'un moyen centralisé pour récupérer des informations sur les dépôts. Les utilisateurs sont donc obligés de les obtenir à partir de diverses commandes. Bien que ",[140,1215,1216],{},"git-rev-parse(1)"," soit devenu l'outil par défaut pour accéder à une grande partie de ces données, il ne s'agit pas de son objectif principal.",[14,1219,1220,1221,1226,1227,1230,1231,1234],{},"Dans le cadre de ce projet, ",[18,1222,1225],{"href":1223,"rel":1224},"https://lucasoshiro.github.io/en/",[],"Lucas Oshiro"," a créé une nouvelle commande, ",[140,1228,1229],{},"git-repo(1)",", qui centralisera toutes les informations au niveau du dépôt. Les utilisateurs peuvent maintenant utiliser ",[140,1232,1233],{},"git repo info"," pour obtenir des informations sur un dépôt :",[258,1236,1238],{"className":260,"code":1237,"language":262,"meta":263,"style":263},"\n$ git repo info layout.bare layout.shallow object.format references.format\n\nlayout.bare=false\nlayout.shallow=false\nobject.format=sha1\nreferences.format=reftable\n\n",[140,1239,1240,1244,1267,1271,1282,1291,1299],{"__ignoreMap":263},[267,1241,1242],{"class":269,"line":270},[267,1243,274],{"emptyLinePlaceholder":273},[267,1245,1246,1248,1250,1252,1255,1258,1261,1264],{"class":269,"line":277},[267,1247,281],{"class":280},[267,1249,285],{"class":284},[267,1251,905],{"class":284},[267,1253,1254],{"class":284}," info",[267,1256,1257],{"class":284}," layout.bare",[267,1259,1260],{"class":284}," layout.shallow",[267,1262,1263],{"class":284}," object.format",[267,1265,1266],{"class":284}," references.format\n",[267,1268,1269],{"class":269,"line":401},[267,1270,274],{"emptyLinePlaceholder":273},[267,1272,1273,1276,1279],{"class":269,"line":406},[267,1274,1275],{"class":280},"layout.bare",[267,1277,1278],{"class":284},"=",[267,1280,1281],{"class":291},"false\n",[267,1283,1284,1287,1289],{"class":269,"line":411},[267,1285,1286],{"class":280},"layout.shallow",[267,1288,1278],{"class":284},[267,1290,1281],{"class":291},[267,1292,1293,1296],{"class":269,"line":420},[267,1294,1295],{"class":280},"object.format",[267,1297,1298],{"class":284},"=sha1\n",[267,1300,1301,1304],{"class":269,"line":429},[267,1302,1303],{"class":280},"references.format",[267,1305,1306],{"class":284},"=reftable\n",[14,1308,1309],{},[589,1310,1198,1311,618,1314,585],{},[18,1312,9],{"href":876,"rel":1313},[],[18,1315,1318],{"href":1316,"rel":1317},"https://gitlab.com/knayakgl",[],"Karthik Nayak",[1178,1320,1322],{"id":1321},"consolidation-des-fonctionnalités-liées-aux-références-dans-git-refs","Consolidation des fonctionnalités liées aux références dans git-refs",[14,1324,1325,1326,1329,1330,1329,1333,618,1336,1339,1340,1343,1344,1349],{},"Git propose plusieurs commandes pour gérer les références, à savoir ",[140,1327,1328],{},"git-for-each-ref(1)",", ",[140,1331,1332],{},"git show-ref(1)",[140,1334,1335],{},"git-update-ref(1)",[140,1337,1338],{},"git-pack-refs(1)",". Cette multiplication des commandes freine leur utilisation et crée des fonctionnalités redondantes. Pour résoudre ce problème, nous avons développé la commande ",[140,1341,1342],{},"git-refs(1)"," afin de consolider ces opérations dans une interface unique. Dans le cadre de ce projet, ",[18,1345,1348],{"href":1346,"rel":1347},"https://inosmeet.github.io/",[],"Meet Soni"," a étendu la commande avec les sous-commandes suivantes :",[363,1351,1352,1358,1364],{},[366,1353,1354,1357],{},[140,1355,1356],{},"git refs optimize"," pour optimiser le backend qui gère les références",[366,1359,1360,1363],{},[140,1361,1362],{},"git refs list"," pour afficher toutes les références",[366,1365,1366,1369],{},[140,1367,1368],{},"git refs exists"," pour vérifier l'existence d'une référence",[14,1371,1372],{},[589,1373,1198,1374,618,1377,585],{},[18,1375,9],{"href":876,"rel":1376},[],[18,1378,1381],{"href":1379,"rel":1380},"https://luolibrary.com/",[],"shejialuo",[37,1383,1385],{"id":1384},"et-après","Et après ?",[14,1387,1388,1389,585],{},"Prêt à découvrir ces améliorations ? Passez à la version Git 2.52.0 et commencez à utiliser ",[140,1390,1391],{},"git last-modified",[14,1393,1394],{},"Chez GitLab, nous nous assurerons que toutes ces améliorations soient déployées dans une instance GitLab près de chez vous !",[14,1396,1397,1398,1402,1403,585],{},"Pour en savoir plus, consultez les ",[18,1399,1401],{"href":26,"rel":1400},[],"notes de version officielles de Git 2.52.0"," et explorez notre ",[18,1404,1407],{"href":1405,"rel":1406},"https://about.gitlab.com/fr-fr/blog/tags/git/",[],"archive complète du développement Git",[1409,1410,1411],"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 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 .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}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);}",{"title":263,"searchDepth":277,"depth":277,"links":1413},[1414,1415,1416,1417,1418,1423],{"id":39,"depth":277,"text":40},{"id":610,"depth":277,"text":611},{"id":778,"depth":277,"text":779},{"id":880,"depth":277,"text":881},{"id":1172,"depth":277,"text":1173,"children":1419},[1420,1421,1422],{"id":1180,"depth":401,"text":1181},{"id":1209,"depth":401,"text":1210},{"id":1321,"depth":401,"text":1322},{"id":1384,"depth":277,"text":1385},"open-source","2025-11-19","Découvrez les contributions à cette version, notamment la nouvelle commande git-last-modified(1), les améliorations des outils de réécriture de l'historique et une nouvelle stratégie de maintenance.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663087/Blog/Hero%20Images/git3-cover.png",{},"/fr-fr/blog/whats-new-in-git-2-52-0",{"config":1434,"title":5,"description":1435,"ogImage":1430},{"noIndex":1429},"Découvrez les contributions à cette version : nouvelle commande git-last-modified(1), amélioration de la réécriture de l'historique et stratégie de maintenance.","whats-new-in-git-2-52-0","fr-fr/blog/whats-new-in-git-2-52-0",[1439,1440,1441],"open source","git","community","BlogPost","jlO8whfnv5MvfeQ8228So4ECcFqqEgWjR7Htot2cQAo",{"logo":1445,"freeTrial":1450,"sales":1455,"login":1460,"items":1465,"search":1793,"minimal":1829,"duo":1848,"switchNav":1857,"pricingDeployment":1868},{"config":1446},{"href":1447,"dataGaName":1448,"dataGaLocation":1449},"/fr-fr/","gitlab logo","header",{"text":1451,"config":1452},"Commencer un essai gratuit",{"href":1453,"dataGaName":1454,"dataGaLocation":1449},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":1456,"config":1457},"Demander une démo",{"href":1458,"dataGaName":1459,"dataGaLocation":1449},"/fr-fr/sales/?contact-topic=request-demo","sales",{"text":1461,"config":1462},"Connexion",{"href":1463,"dataGaName":1464,"dataGaLocation":1449},"https://gitlab.com/users/sign_in/","sign in",[1466,1495,1597,1602,1715,1771],{"text":1467,"config":1468,"menu":1470},"Plateforme",{"dataNavLevelOne":1469},"platform",{"type":1471,"columns":1472},"cards",[1473,1479,1487],{"title":1467,"description":1474,"link":1475},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":1476,"config":1477},"Explorer notre plateforme",{"href":1478,"dataGaName":1469,"dataGaLocation":1449},"/fr-fr/platform/",{"title":1480,"description":1481,"link":1482},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":1483,"config":1484},"Découvrir GitLab Duo",{"href":1485,"dataGaName":1486,"dataGaLocation":1449},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1488,"description":1489,"link":1490},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":1491,"config":1492},"En savoir plus",{"href":1493,"dataGaName":1494,"dataGaLocation":1449},"/fr-fr/why-gitlab/","why gitlab",{"text":1496,"left":273,"config":1497,"menu":1499},"Produit",{"dataNavLevelOne":1498},"solutions",{"type":1500,"link":1501,"columns":1505,"feature":1576},"lists",{"text":1502,"config":1503},"Voir toutes les solutions",{"href":1504,"dataGaName":1498,"dataGaLocation":1449},"/fr-fr/solutions/",[1506,1531,1554],{"title":1507,"description":1508,"link":1509,"items":1514},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":1510},{"icon":1511,"href":1512,"dataGaName":1513,"dataGaLocation":1449},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[1515,1519,1522,1527],{"text":1516,"config":1517},"CI/CD",{"href":1518,"dataGaLocation":1449,"dataGaName":1516},"/fr-fr/solutions/continuous-integration/",{"text":1480,"config":1520},{"href":1485,"dataGaLocation":1449,"dataGaName":1521},"gitlab duo agent platform - product menu",{"text":1523,"config":1524},"Gestion du code source",{"href":1525,"dataGaLocation":1449,"dataGaName":1526},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":1528,"config":1529},"Livraison de logiciels automatisée",{"href":1512,"dataGaLocation":1449,"dataGaName":1530},"Automated software delivery",{"title":1532,"description":1533,"link":1534,"items":1539},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":1535},{"href":1536,"dataGaName":1537,"dataGaLocation":1449,"icon":1538},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1540,1544,1549],{"text":1541,"config":1542},"Tests de sécurité des applications",{"href":1536,"dataGaName":1543,"dataGaLocation":1449},"Application security testing",{"text":1545,"config":1546},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":1547,"dataGaLocation":1449,"dataGaName":1548},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":1550,"config":1551},"Conformité logicielle",{"href":1552,"dataGaName":1553,"dataGaLocation":1449},"/fr-fr/solutions/software-compliance/","software compliance",{"title":1555,"link":1556,"items":1561},"Mesures",{"config":1557},{"icon":1558,"href":1559,"dataGaName":1560,"dataGaLocation":1449},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[1562,1566,1571],{"text":1563,"config":1564},"Visibilité et mesures",{"href":1559,"dataGaLocation":1449,"dataGaName":1565},"Visibility and Measurement",{"text":1567,"config":1568},"Gestion de la chaîne de valeur",{"href":1569,"dataGaLocation":1449,"dataGaName":1570},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":1572,"config":1573},"Analyses et informations",{"href":1574,"dataGaLocation":1449,"dataGaName":1575},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":1577,"type":1500,"items":1578},"GitLab",[1579,1585,1591],{"text":1580,"config":1581},"Entreprises",{"icon":1582,"href":1583,"dataGaLocation":1449,"dataGaName":1584},"Building","/fr-fr/enterprise/","enterprise",{"text":1586,"config":1587},"Pour les PME",{"icon":1588,"href":1589,"dataGaLocation":1449,"dataGaName":1590},"Work","/fr-fr/small-business/","small business",{"text":1592,"config":1593},"Pour le secteur public",{"icon":1594,"href":1595,"dataGaLocation":1449,"dataGaName":1596},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":1598,"config":1599},"Tarifs",{"href":1600,"dataGaName":1601,"dataGaLocation":1449,"dataNavLevelOne":1601},"/fr-fr/pricing/","pricing",{"text":1603,"config":1604,"menu":1606},"Ressources",{"dataNavLevelOne":1605},"resources",{"type":1500,"link":1607,"columns":1611,"feature":1704},{"text":1608,"config":1609},"Afficher toutes les ressources",{"href":1610,"dataGaName":1605,"dataGaLocation":1449},"/fr-fr/resources/",[1612,1645,1672],{"title":1613,"items":1614},"Premiers pas",[1615,1620,1625,1630,1635,1640],{"text":1616,"config":1617},"Installation",{"href":1618,"dataGaName":1619,"dataGaLocation":1449},"/fr-fr/install/","install",{"text":1621,"config":1622},"Guides de démarrage",{"href":1623,"dataGaName":1624,"dataGaLocation":1449},"/fr-fr/get-started/","quick setup checklists",{"text":1626,"config":1627},"Apprentissage",{"href":1628,"dataGaLocation":1449,"dataGaName":1629},"https://university.gitlab.com/","learn",{"text":1631,"config":1632},"Documentation",{"href":1633,"dataGaName":1634,"dataGaLocation":1449},"https://docs.gitlab.com/","product documentation",{"text":1636,"config":1637},"Vidéos sur les bonnes pratiques",{"href":1638,"dataGaName":1639,"dataGaLocation":1449},"/fr-fr/getting-started-videos/","best practice videos",{"text":1641,"config":1642},"Intégrations",{"href":1643,"dataGaName":1644,"dataGaLocation":1449},"/fr-fr/integrations/","integrations",{"title":1646,"items":1647},"Découvrir",[1648,1653,1658,1663,1667],{"text":1649,"config":1650},"Témoignages clients",{"href":1651,"dataGaName":1652,"dataGaLocation":1449},"/fr-fr/customers/","customer success stories",{"text":1654,"config":1655},"Blog",{"href":1656,"dataGaName":1657,"dataGaLocation":1449},"/fr-fr/blog/","blog",{"text":1659,"config":1660},"Demo Hub",{"href":1661,"dataGaName":1662,"dataGaLocation":1449},"/fr-fr/demo-hub/","demo hub",{"text":1664,"config":1665},"The Source",{"href":1666,"dataGaName":1657,"dataGaLocation":1449},"/fr-fr/the-source/",{"text":1668,"config":1669},"Travail à distance",{"href":1670,"dataGaName":1671,"dataGaLocation":1449},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1673,"items":1674},"Connecter",[1675,1680,1685,1689,1694,1699],{"text":1676,"config":1677},"Services GitLab",{"href":1678,"dataGaName":1679,"dataGaLocation":1449},"/fr-fr/services/","services",{"text":1681,"config":1682},"Contribuer",{"href":1683,"dataGaName":1684,"dataGaLocation":1449},"https://contributors.gitlab.com","contribute",{"text":1686,"config":1687},"Communauté",{"href":1688,"dataGaName":1441,"dataGaLocation":1449},"/community/",{"text":1690,"config":1691},"Forum",{"href":1692,"dataGaName":1693,"dataGaLocation":1449},"https://forum.gitlab.com/","forum",{"text":1695,"config":1696},"Événements",{"href":1697,"dataGaName":1698,"dataGaLocation":1449},"/events/","events",{"text":1700,"config":1701},"Partenaires",{"href":1702,"dataGaName":1703,"dataGaLocation":1449},"/fr-fr/partners/","partners",{"config":1705,"title":1708,"text":1709,"link":1710},{"background":1706,"textColor":1707},"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":1711,"config":1712},"Lire les articles les plus récents",{"href":1713,"dataGaName":1714,"dataGaLocation":1449},"/fr-fr/whats-new/","whats new",{"text":1716,"config":1717,"menu":1719},"Société",{"dataNavLevelOne":1718},"company",{"type":1500,"columns":1720},[1721],{"items":1722},[1723,1728,1734,1736,1741,1746,1751,1756,1761,1766],{"text":1724,"config":1725},"À propos",{"href":1726,"dataGaName":1727,"dataGaLocation":1449},"/fr-fr/company/","about",{"text":1729,"config":1730,"footerGa":1733},"Carrières",{"href":1731,"dataGaName":1732,"dataGaLocation":1449},"/jobs/","jobs",{"dataGaName":1732},{"text":1695,"config":1735},{"href":1697,"dataGaName":1698,"dataGaLocation":1449},{"text":1737,"config":1738},"Leadership",{"href":1739,"dataGaName":1740,"dataGaLocation":1449},"/company/team/e-group/","leadership",{"text":1742,"config":1743},"Manuel",{"href":1744,"dataGaName":1745,"dataGaLocation":1449},"https://handbook.gitlab.com/","handbook",{"text":1747,"config":1748},"Relations avec les investisseurs",{"href":1749,"dataGaName":1750,"dataGaLocation":1449},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1752,"config":1753},"Trust Center",{"href":1754,"dataGaName":1755,"dataGaLocation":1449},"/fr-fr/security/","trust center",{"text":1757,"config":1758},"Centre pour la transparence de l'IA",{"href":1759,"dataGaName":1760,"dataGaLocation":1449},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":1762,"config":1763},"Newsletter",{"href":1764,"dataGaName":1765,"dataGaLocation":1449},"/company/contact/#contact-forms","newsletter",{"text":1767,"config":1768},"Presse",{"href":1769,"dataGaName":1770,"dataGaLocation":1449},"/press/","press",{"text":1772,"config":1773,"menu":1774},"Nous contacter",{"dataNavLevelOne":1718},{"type":1500,"columns":1775},[1776],{"items":1777},[1778,1783,1788],{"text":1779,"config":1780},"Contacter l'équipe commerciale",{"href":1781,"dataGaName":1782,"dataGaLocation":1449},"/fr-fr/sales/","talk to sales",{"text":1784,"config":1785},"Assistance GitLab",{"href":1786,"dataGaName":1787,"dataGaLocation":1449},"https://support.gitlab.com/hc/en-us","support portal",{"text":1789,"config":1790},"Portail clients GitLab",{"href":1791,"dataGaName":1792,"dataGaLocation":1449},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1794,"login":1795,"suggestions":1802},"Fermer",{"text":1796,"link":1797},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":1798,"config":1799},"GitLab.com",{"href":1463,"dataGaName":1800,"dataGaLocation":1801},"search login","search",{"text":1803,"default":1804},"Suggestions",[1805,1808,1813,1815,1820,1825],{"text":1480,"config":1806},{"href":1485,"dataGaName":1807,"dataGaLocation":1801},"GitLab Duo Agent Platform",{"text":1809,"config":1810},"Suggestions de code (IA)",{"href":1811,"dataGaName":1812,"dataGaLocation":1801},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1516,"config":1814},{"href":1518,"dataGaName":1516,"dataGaLocation":1801},{"text":1816,"config":1817},"GitLab sur AWS",{"href":1818,"dataGaName":1819,"dataGaLocation":1801},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":1821,"config":1822},"GitLab sur Google Cloud",{"href":1823,"dataGaName":1824,"dataGaLocation":1801},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1826,"config":1827},"Pourquoi utiliser GitLab ?",{"href":1493,"dataGaName":1828,"dataGaLocation":1801},"Why GitLab?",{"freeTrial":1830,"mobileIcon":1835,"desktopIcon":1840,"secondaryButton":1843},{"text":1831,"config":1832},"Commencer votre essai gratuit",{"href":1833,"dataGaName":1454,"dataGaLocation":1834},"https://gitlab.com/-/trials/new/","nav",{"altText":1836,"config":1837},"Icône GitLab",{"src":1838,"dataGaName":1839,"dataGaLocation":1834},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1836,"config":1841},{"src":1842,"dataGaName":1839,"dataGaLocation":1834},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1844,"config":1845},"Commencer",{"href":1846,"dataGaName":1847,"dataGaLocation":1834},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":1849,"mobileIcon":1853,"desktopIcon":1855},{"text":1850,"config":1851},"En savoir plus sur GitLab Duo",{"href":1485,"dataGaName":1852,"dataGaLocation":1834},"gitlab duo",{"altText":1836,"config":1854},{"src":1838,"dataGaName":1839,"dataGaLocation":1834},{"altText":1836,"config":1856},{"src":1842,"dataGaName":1839,"dataGaLocation":1834},{"button":1858,"mobileIcon":1863,"desktopIcon":1865},{"text":1859,"config":1860},"/switch",{"href":1861,"dataGaName":1862,"dataGaLocation":1834},"#contact","switch",{"altText":1836,"config":1864},{"src":1838,"dataGaName":1839,"dataGaLocation":1834},{"altText":1836,"config":1866},{"src":1867,"dataGaName":1839,"dataGaLocation":1834},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1869,"mobileIcon":1874,"desktopIcon":1876},{"text":1870,"config":1871},"Retour aux tarifs",{"href":1600,"dataGaName":1872,"dataGaLocation":1834,"icon":1873},"back to pricing","GoBack",{"altText":1836,"config":1875},{"src":1838,"dataGaName":1839,"dataGaLocation":1834},{"altText":1836,"config":1877},{"src":1842,"dataGaName":1839,"dataGaLocation":1834},{"title":1879,"button":1880,"config":1884},"GitLab Orbit est arrivé : la couche de contexte pour les agents d'IA.",{"text":1491,"config":1881},{"href":1882,"dataGaName":1883,"dataGaLocation":1449},"/fr-fr/gitlab-orbit/","orbit",{"layout":1885,"disabled":1429},"release",{"data":1887},{"text":1888,"source":1889,"edit":1895,"contribute":1900,"config":1904,"items":1909,"minimal":2117},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":1890,"config":1891},"Afficher le code source de la page",{"href":1892,"dataGaName":1893,"dataGaLocation":1894},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1896,"config":1897},"Modifier cette page",{"href":1898,"dataGaName":1899,"dataGaLocation":1894},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1681,"config":1901},{"href":1902,"dataGaName":1903,"dataGaLocation":1894},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1905,"facebook":1906,"youtube":1907,"linkedin":1908},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1910,1956,2009,2052,2084],{"title":1598,"links":1911,"subMenu":1926},[1912,1916,1921],{"text":1913,"config":1914},"Voir les forfaits",{"href":1600,"dataGaName":1915,"dataGaLocation":1894},"view plans",{"text":1917,"config":1918},"GitLab Premium",{"href":1919,"dataGaName":1920,"dataGaLocation":1894},"/fr-fr/pricing/premium/","why premium",{"text":1922,"config":1923},"GitLab Ultimate",{"href":1924,"dataGaName":1925,"dataGaLocation":1894},"/fr-fr/pricing/ultimate/","why ultimate",[1927],{"title":1772,"links":1928},[1929,1931,1933,1936,1941,1946,1951],{"text":1779,"config":1930},{"href":1781,"dataGaName":1459,"dataGaLocation":1894},{"text":1784,"config":1932},{"href":1786,"dataGaName":1787,"dataGaLocation":1894},{"text":1934,"config":1935},"Portail clients",{"href":1791,"dataGaName":1792,"dataGaLocation":1894},{"text":1937,"config":1938},"Statut",{"href":1939,"dataGaName":1940,"dataGaLocation":1894},"https://status.gitlab.com/","status",{"text":1942,"config":1943},"Conditions d'utilisation",{"href":1944,"dataGaName":1945,"dataGaLocation":1894},"/terms/","terms of use",{"text":1947,"config":1948},"Politique de confidentialité",{"href":1949,"dataGaName":1950,"dataGaLocation":1894},"/fr-fr/privacy/","privacy statement",{"text":1952,"config":1953},"Gestion des cookies",{"dataGaName":1954,"dataGaLocation":1894,"id":1955,"isOneTrustButton":273},"cookie preferences","ot-sdk-btn",{"title":1496,"links":1957,"subMenu":1966},[1958,1962],{"text":1959,"config":1960},"Plateforme DevSecOps",{"href":1478,"dataGaName":1961,"dataGaLocation":1894},"devsecops platform",{"text":1963,"config":1964},"Développement assisté par l'IA",{"href":1485,"dataGaName":1965,"dataGaLocation":1894},"ai-assisted development",[1967],{"title":1968,"links":1969},"Thèmes",[1970,1974,1979,1984,1989,1994,1999,2004],{"text":1516,"config":1971},{"href":1972,"dataGaName":1973,"dataGaLocation":1894},"/fr-fr/topics/ci-cd/","cicd",{"text":1975,"config":1976},"GitOps",{"href":1977,"dataGaName":1978,"dataGaLocation":1894},"/fr-fr/topics/gitops/","gitops",{"text":1980,"config":1981},"DevOps",{"href":1982,"dataGaName":1983,"dataGaLocation":1894},"/fr-fr/topics/devops/","devops",{"text":1985,"config":1986},"Contrôle de version",{"href":1987,"dataGaName":1988,"dataGaLocation":1894},"/fr-fr/topics/version-control/","version control",{"text":1990,"config":1991},"DevSecOps",{"href":1992,"dataGaName":1993,"dataGaLocation":1894},"/fr-fr/topics/devsecops/","devsecops",{"text":1995,"config":1996},"Cloud-native",{"href":1997,"dataGaName":1998,"dataGaLocation":1894},"/fr-fr/topics/cloud-native/","cloud native",{"text":2000,"config":2001},"IA pour la programmation",{"href":2002,"dataGaName":2003,"dataGaLocation":1894},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":2005,"config":2006},"IA agentique",{"href":2007,"dataGaName":2008,"dataGaLocation":1894},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":2010,"links":2011},"Solutions",[2012,2015,2017,2022,2025,2028,2031,2034,2036,2039,2042,2047],{"text":1541,"config":2013},{"href":1536,"dataGaName":2014,"dataGaLocation":1894},"Application Security Testing",{"text":1528,"config":2016},{"href":1512,"dataGaName":1513,"dataGaLocation":1894},{"text":2018,"config":2019},"Développement Agile",{"href":2020,"dataGaName":2021,"dataGaLocation":1894},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":1523,"config":2023},{"href":1525,"dataGaName":2024,"dataGaLocation":1894},"source code management",{"text":1516,"config":2026},{"href":1518,"dataGaName":2027,"dataGaLocation":1894},"continuous integration & delivery",{"text":1567,"config":2029},{"href":1569,"dataGaName":2030,"dataGaLocation":1894},"value stream management",{"text":1975,"config":2032},{"href":2033,"dataGaName":1978,"dataGaLocation":1894},"/fr-fr/solutions/gitops/",{"text":1580,"config":2035},{"href":1583,"dataGaName":1584,"dataGaLocation":1894},{"text":2037,"config":2038},"PME",{"href":1589,"dataGaName":1590,"dataGaLocation":1894},{"text":2040,"config":2041},"Secteur public",{"href":1595,"dataGaName":1596,"dataGaLocation":1894},{"text":2043,"config":2044},"Éducation",{"href":2045,"dataGaName":2046,"dataGaLocation":1894},"/fr-fr/solutions/education/","education",{"text":2048,"config":2049},"Services financiers",{"href":2050,"dataGaName":2051,"dataGaLocation":1894},"/fr-fr/solutions/finance/","financial services",{"title":1603,"links":2053},[2054,2056,2058,2060,2063,2065,2068,2070,2072,2074,2076,2078,2080,2082],{"text":1616,"config":2055},{"href":1618,"dataGaName":1619,"dataGaLocation":1894},{"text":1621,"config":2057},{"href":1623,"dataGaName":1624,"dataGaLocation":1894},{"text":1626,"config":2059},{"href":1628,"dataGaName":1629,"dataGaLocation":1894},{"text":1631,"config":2061},{"href":1633,"dataGaName":2062,"dataGaLocation":1894},"docs",{"text":1654,"config":2064},{"href":1656,"dataGaName":1657,"dataGaLocation":1894},{"text":2066,"config":2067},"Nouveautés",{"href":1713,"dataGaName":1714,"dataGaLocation":1894},{"text":1649,"config":2069},{"href":1651,"dataGaName":1652,"dataGaLocation":1894},{"text":1668,"config":2071},{"href":1670,"dataGaName":1671,"dataGaLocation":1894},{"text":1676,"config":2073},{"href":1678,"dataGaName":1679,"dataGaLocation":1894},{"text":1681,"config":2075},{"href":1683,"dataGaName":1684,"dataGaLocation":1894},{"text":1686,"config":2077},{"href":1688,"dataGaName":1441,"dataGaLocation":1894},{"text":1690,"config":2079},{"href":1692,"dataGaName":1693,"dataGaLocation":1894},{"text":1695,"config":2081},{"href":1697,"dataGaName":1698,"dataGaLocation":1894},{"text":1700,"config":2083},{"href":1702,"dataGaName":1703,"dataGaLocation":1894},{"title":1716,"links":2085},[2086,2088,2090,2092,2094,2096,2101,2106,2108,2110,2112],{"text":1724,"config":2087},{"href":1726,"dataGaName":1718,"dataGaLocation":1894},{"text":1729,"config":2089},{"href":1731,"dataGaName":1732,"dataGaLocation":1894},{"text":1737,"config":2091},{"href":1739,"dataGaName":1740,"dataGaLocation":1894},{"text":1742,"config":2093},{"href":1744,"dataGaName":1745,"dataGaLocation":1894},{"text":1747,"config":2095},{"href":1749,"dataGaName":1750,"dataGaLocation":1894},{"text":2097,"config":2098},"Développement durable",{"href":2099,"dataGaName":2100,"dataGaLocation":1894},"/sustainability/","Sustainability",{"text":2102,"config":2103},"Diversité, inclusion et appartenance (DIB)",{"href":2104,"dataGaName":2105,"dataGaLocation":1894},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1752,"config":2107},{"href":1754,"dataGaName":1755,"dataGaLocation":1894},{"text":1762,"config":2109},{"href":1764,"dataGaName":1765,"dataGaLocation":1894},{"text":1767,"config":2111},{"href":1769,"dataGaName":1770,"dataGaLocation":1894},{"text":2113,"config":2114},"Déclaration de transparence sur l'esclavage moderne",{"href":2115,"dataGaName":2116,"dataGaLocation":1894},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2118},[2119,2121,2123],{"text":1942,"config":2120},{"href":1944,"dataGaName":1945,"dataGaLocation":1894},{"text":1952,"config":2122},{"dataGaName":1954,"dataGaLocation":1894,"id":1955,"isOneTrustButton":273},{"text":1947,"config":2124},{"href":1949,"dataGaName":1950,"dataGaLocation":1894},[2126,2140,2152],{"id":2127,"title":7,"body":1428,"config":2128,"content":2130,"description":1428,"extension":2134,"meta":2135,"navigation":273,"path":2136,"seo":2137,"stem":2138,"__hash__":2139},"blogAuthors/en-us/blog/authors/christian-couder.yml",{"template":2129},"BlogAuthor",{"name":7,"config":2131},{"headshot":2132,"ctfId":2133},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663687/Blog/Author%20Headshots/chriscool-headshot.jpg","chriscool","yml",{},"/en-us/blog/authors/christian-couder",{},"en-us/blog/authors/christian-couder","6VsKjKNdm1XKAmFMZHj53ROyylDlxaSJhcARRkw6EQQ",{"id":2141,"title":8,"body":1428,"config":2142,"content":2143,"description":1428,"extension":2134,"meta":2147,"navigation":273,"path":2148,"seo":2149,"stem":2150,"__hash__":2151},"blogAuthors/en-us/blog/authors/toon-claes.yml",{"template":2129},{"name":8,"config":2144},{"headshot":2145,"ctfId":2146},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663082/Blog/Author%20Headshots/toon_claes_headshot.png","toon",{},"/en-us/blog/authors/toon-claes",{},"en-us/blog/authors/toon-claes","guXJXoqO1anz4H932Namk7kqyZsO1xyVQr6stBL4o18",{"id":2153,"title":9,"body":1428,"config":2154,"content":2155,"description":1428,"extension":2134,"meta":2159,"navigation":273,"path":2160,"seo":2161,"stem":2162,"__hash__":2163},"blogAuthors/en-us/blog/authors/patrick-steinhardt.yml",{"template":2129},{"name":9,"config":2156},{"headshot":2157,"ctfId":2158},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749661952/Blog/Author%20Headshots/pks-gitlab-headshot.png","pksgitlab",{},"/en-us/blog/authors/patrick-steinhardt",{},"en-us/blog/authors/patrick-steinhardt","SV9Yd_vW69UbvntDP-SEOV9NKT_VwUAj5nfftf2ElSw",[2165,2172,2179],{"title":2166,"description":2167,"heroImage":2168,"category":1424,"date":2169,"authors":2170,"slug":2171,"externalUrl":1428},"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",[8],"whats-new-in-git-2-55-0",{"title":2173,"description":2174,"heroImage":2175,"category":1424,"date":2176,"authors":2177,"slug":2178,"externalUrl":1428},"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",[9],"whats-new-in-git-2-54-0",{"title":2180,"description":2181,"heroImage":2182,"category":1424,"date":2183,"authors":2184,"slug":2186,"externalUrl":1428},"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",[2185],"Nick Veenhof","gitlab-ai-hackathon-2026-meet-the-winners",{"promotions":2188},[2189,2203,2215,2227],{"id":2190,"categories":2191,"header":2193,"text":2194,"button":2195,"image":2200},"ai-modernization",[2192],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":2196,"config":2197},"Obtenez votre score de maturité IA",{"href":2198,"dataGaName":2199,"dataGaLocation":1657},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":2201},{"src":2202},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2204,"categories":2205,"header":2207,"text":2194,"button":2208,"image":2212},"devops-modernization",[2206,1993],"product","Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":2209,"config":2210},"Obtenez votre score de maturité DevOps",{"href":2211,"dataGaName":2199,"dataGaLocation":1657},"/fr-fr/assessments/devops-modernization-assessment/",{"config":2213},{"src":2214},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2216,"categories":2217,"header":2219,"text":2194,"button":2220,"image":2224},"security-modernization",[2218],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":2221,"config":2222},"Obtenez votre score de maturité en matière de sécurité",{"href":2223,"dataGaName":2199,"dataGaLocation":1657},"/fr-fr/assessments/security-modernization-assessment/",{"config":2225},{"src":2226},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2228,"paths":2229,"header":2232,"text":2233,"button":2234,"image":2239},"github-azure-migration",[2230,2231],"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":2235,"config":2236},"Découvrez les différences entre GitLab et GitHub",{"href":2237,"dataGaName":2238,"dataGaLocation":1657},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2240},{"src":2214},{"header":2242,"blurb":2243,"button":2244,"secondaryButton":2248},"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":1451,"config":2245},{"href":2246,"dataGaName":1454,"dataGaLocation":2247},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":1779,"config":2249},{"href":1781,"dataGaName":1459,"dataGaLocation":2247},1786803785349]