You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
gitattributes: aucune regle eol pour *.md — 69 blobs CRLF sur main, et la regle README notebooks rate 8 fichiers sur la profondeur de son glob #14570
MISE A JOUR 2026-09-04T07:0xZ (ai-01) — la moitie slides/** est LIVREE, la moitie READMEs reste. #14504 a merge en portant slides/**/*.md text eol=lf dans .gitattributes (commit ad03631a94). La regle mord — verifie au matcher canonique sur origin/main post-merge, dans un worktree detache :
Mais une regle ne renormalise pas retroactivement : ces 3 blobs portent toujours leurs 4 630 octets CR, ils ne basculeront qu'a leur prochaine edition ou sur un git add --renormalize explicite. Le reste a faire est donc precise plus bas (section « Reste a faire »), et il a retreci, pas disparu.
Piege d'instrument rencontre en ecrivant cette mise a jour : git check-attr lit le .gitattributes de l'arbre de travail, pas celui de la revision qu'on croit interroger. Mesure faite depuis un arbre reste en arriere du merge, elle rend « 0 couvert » sur les slides — l'inverse de la verite, et sans aucun signal d'erreur. Interroger une autre revision demande un git worktree add --detach <rev>.
Frere de #14353 (*.py, livre par #14474) pour l'autre moitie du trou. Deux PRs ouvertes en ce moment se sont fait bloquer dessus, chacune sur une lane differente, et aucune des deux n'a fait de faute : rien dans .gitattributes ne les en empechait.
Mesure
Instrument : git cat-file blob "$(git rev-parse REV:PATH)" | tr -cd '\r' | wc -c — pasgrep -c $'\r$', qui sous Git Bash ne rend jamais zero (il compte toutes les lignes du fichier ; controle positif en bas de page).
Sur origin/main, 69 blobs .md sur 1611 suivis portent des octets CR (12 977 au total). Couverture reelle, mesuree avec git check-attr et non avec un matcher maison :
Ensemble
blobs
octets CR
couvert par une regle eol=lf ?
slides/**
3
4 630
non
MyIA.AI.Notebooks/**/README.md
8
1 307
non — alors que la regle en place veut les couvrir
docs/archive/** (materiau gele)
51
5 692
non
autres docs/**
5
801
non
autres MyIA.AI.Notebooks/**
2
547
non
total
69
12 977
0 couvert
Le defaut le plus net : la regle README rate sa cible sur la profondeur du glob
La regle s'arrete a un niveau. Les huit README notebooks porteurs de CR vivent tous plus bas — dont, exactement, celui de #14568. Ce n'est donc pas un manque de politique : c'est une regle existante dont l'intention ecrite (« files consumed by the catalog-drift CI check ... to avoid a wide renormalization of unrelated .md files ») est defaite par la semantique du glob.
Note d'instrument : fnmatch de Python fait matcher * a travers / et rendait ici « 8 couverts sur 8 » — l'inverse de la verite. Seul git check-attr repond a la question posee.
Dans les deux cas la revue a du separer a la main le vehicule du contenu, et la tranche suivante sur le meme fichier heriterait du churn. C'est la meme mecanique que le conflit whole-file de #13951 cite par #14353 — sur .md au lieu de .py.
Et la population grandit : #14353 mesurait 9 blobs .py CRLF le 2026-09-02 ; ils sont 10 aujourd'hui, main en ayant ajoute un le 2026-09-03 (les 111 lignes de #14511 dans scripts/tests/test_check_pr_perimeter.py, arrivees en CRLF). Sans regle, la fuite est active, pas historique.
Options
(a) *.md text eol=lf global — 69 blobs renormalises d'un coup, dont 51 dans docs/archive/. Ferme la classe, mais contredit frontalement le commentaire de #1056 qui a choisi la portee etroite pour eviter « a wide renormalization of unrelated .md files », et fait passer 5 692 octets de churn sur du materiau gele que personne n'edite.
(b) portee sur la surface vivante — recommandee, et a moitie livree :
(c) statu quo — continuer a l'attraper en revue. C'est ce qui vient de couter deux cycles de review sur deux lanes, et ca ne s'ameliore pas tout seul.
Je recommande (b), et pas (a) : (a) melange une correction de regle avec une renormalisation d'archive, ce qui rend la PR illisible pour exactement la raison que l'issue denonce.
Piege d'instrument, a relire avant toute mesure d'EOL
$ printf'a\nb\nc\n'> lf.txt # LF pur, zero octet CR
$ grep -c $'\r$' lf.txt3 # compte TOUTES les lignes
$ tr -cd '\r'< lf.txt | wc -c0 # la verite
Le $'\r' n'atteint pas grep comme un octet CR sous Git Bash ; le motif degenere en $. L'instrument ne rend jamais zero, des deux cotes d'une comparaison a la fois — donc invisible au differentiel. Voisins : git show REV:PATH applique les filtres de working-tree (seul git cat-file blob lit le blob stocke), et baseRefOid n'est pas la merge-base.
Frere de #14353 (
*.py, livre par #14474) pour l'autre moitie du trou. Deux PRs ouvertes en ce moment se sont fait bloquer dessus, chacune sur une lane differente, et aucune des deux n'a fait de faute : rien dans.gitattributesne les en empechait.Mesure
Instrument :
git cat-file blob "$(git rev-parse REV:PATH)" | tr -cd '\r' | wc -c— pasgrep -c $'\r$', qui sous Git Bash ne rend jamais zero (il compte toutes les lignes du fichier ; controle positif en bas de page).Sur
origin/main, 69 blobs.mdsur 1611 suivis portent des octets CR (12 977 au total). Couverture reelle, mesuree avecgit check-attret non avec un matcher maison :eol=lf?slides/**MyIA.AI.Notebooks/**/README.mddocs/archive/**(materiau gele)docs/**MyIA.AI.Notebooks/**Le defaut le plus net : la regle README rate sa cible sur la profondeur du glob
.gitattributesporte deja, depuis #1056 :Dans
.gitattributes,*ne traverse pas/. Controle positif :La regle s'arrete a un niveau. Les huit README notebooks porteurs de CR vivent tous plus bas — dont, exactement, celui de #14568. Ce n'est donc pas un manque de politique : c'est une regle existante dont l'intention ecrite (« files consumed by the catalog-drift CI check ... to avoid a wide renormalization of unrelated .md files ») est defaite par la semantique du glob.
Note d'instrument :
fnmatchde Python fait matcher*a travers/et rendait ici « 8 couverts sur 8 » — l'inverse de la verite. Seulgit check-attrrepond a la question posee.Ce que ca a coute, en PRs vivantes
slides/06-apprentissage/slides.md.../Track2-GoogleADK/README.mdDans les deux cas la revue a du separer a la main le vehicule du contenu, et la tranche suivante sur le meme fichier heriterait du churn. C'est la meme mecanique que le conflit whole-file de #13951 cite par #14353 — sur
.mdau lieu de.py.Et la population grandit : #14353 mesurait 9 blobs
.pyCRLF le 2026-09-02 ; ils sont 10 aujourd'hui,mainen ayant ajoute un le 2026-09-03 (les 111 lignes de #14511 dansscripts/tests/test_check_pr_perimeter.py, arrivees en CRLF). Sans regle, la fuite est active, pas historique.Options
(a)
*.md text eol=lfglobal — 69 blobs renormalises d'un coup, dont 51 dansdocs/archive/. Ferme la classe, mais contredit frontalement le commentaire de #1056 qui a choisi la portee etroite pour eviter « a wide renormalization of unrelated .md files », et fait passer 5 692 octets de churn sur du materiau gele que personne n'edite.(b) portee sur la surface vivante — recommandee, et a moitie livree :
11 blobs, 5 937 octets CR au total.
docs/archive/**reste intouche, ce qui est le bon defaut pour de l'archive.Reste a faire (perimetre reel apres #14504)
MyIA.AI.Notebooks/**/README.mdslides/**Les 8 README concernes, mesures sur
origin/main:(c) statu quo — continuer a l'attraper en revue. C'est ce qui vient de couter deux cycles de review sur deux lanes, et ca ne s'ameliore pas tout seul.
Je recommande (b), et pas (a) : (a) melange une correction de regle avec une renormalisation d'archive, ce qui rend la PR illisible pour exactement la raison que l'issue denonce.
Acceptance
.gitattributesporte la regleMyIA.AI.Notebooks/**/README.md text eol=lf, avec un commentaire disant pourquoi*ne suffisait pas (la lecon de profondeur se perd sinon). La regleslides/**/*.mdest deja la depuis feat(slides,#11508): detrame 114 images COMMENT_TRAPPED en 06-apprentissage #14504 — ne pas la redoubler.slides/**que feat(slides,#11508): detrame 114 images COMMENT_TRAPPED en 06-apprentissage #14504 a couverts sans les reecrire) sont renormalises dans la meme PR (git add --renormalize), sinon la regle ne mord qu'a la prochaine edition et le prochain diff reste illisible.git check-attr eol -- MyIA.AI.Notebooks/ML/DataScienceWithAgents/Track2-GoogleADK/README.md # doit rendre lfdocs/archive/**reste hors portee — a dire explicitement, pour qu'une tranche suivante ne le prenne pas pour un oubli.*.mdsans revenir sur le commentaire de Recurring CI false positive: catalog-drift check fails on Linux while local Windows shows no drift #1056 : si on veut (a), c'est une decision separee et elle se documente.Piege d'instrument, a relire avant toute mesure d'EOL
Le
$'\r'n'atteint pasgrepcomme un octet CR sous Git Bash ; le motif degenere en$. L'instrument ne rend jamais zero, des deux cotes d'une comparaison a la fois — donc invisible au differentiel. Voisins :git show REV:PATHapplique les filtres de working-tree (seulgit cat-file bloblit le blob stocke), etbaseRefOidn'est pas la merge-base.See #14353, #14504, #14568, #1056.