node_modules נכנס למאגר כקישור סמלי, ומאז כל checkout מוחק התקנה - #30
Merged
Y-PLONI merged 1 commit intoSep 2, 2026
Merged
Conversation
ב-`main` יש רשומה במצב `120000` בשם `node_modules`, שמצביעה לנתיב מוחלט במכונה של מי שיצר אותה (`/Users/david/…`). זה הקישור הסמלי היחיד במאגר בכל ההיסטוריה. מה שזה עושה, נמדד: `git checkout` של ה-main הזה בעץ עבודה שיש בו התקנה **מחליף את התיקייה `node_modules` בקובץ של 70 בייט** — כלומר מוחק את ההתקנה. זה קרה כאן על עץ עבודה שרק דקות לפני כן הושלמה בו התקנה מלאה. **ולמה בשקט:** `node_modules/` גורם לגיט להתעלם מהתיקייה, ולכן השומר „המחיקה הזאת תדרוס קבצים לא-מנוטרים” אינו חל. `checkout` יוצא 0 ואינו מדפיס דבר. זה הצירוף שקובע — הרשומה מצד אחד, ותבנית ההתעלמות מצד שני. ב-Windows הרשומה מתממשת כקובץ טקסט שתוכנו הנתיב, מפני ש-`core.symlinks=false` בקונפיג המערכתי של Git for Windows. זו הגדרה ולא מגבלת מערכת הפעלה: המכונה כן יוצרת קישורים סמליים וגיט מנטר אותם כ-`120000`. ב-Unix הרשומה מתממשת כקישור תלוי שאינו מצביע לשום מקום. מה שזה **אינו** עושה: להפיל את ה-CI. `npm ci`/`npm install` מדווח `npm warn reify Removing non-directory …` ומתאושש — ב-`@npmcli/arborist` הבדיקה היא `lstat`, ולכן גם קישור תלוי ב-Linux אינו נראה כתיקייה ונמחק באותו מסלול. הלוג של `Release` על `8c776e9` מדפיס את האזהרה הזאת בעצמו. לכן הכשל נופל על מי שמשך את main, ולא על ה-CI. ## וזה כבר תוקן פעם אחת, ובוטל הרשומה נוספה ב-37de9f7 ונכנסה ל-main במיזוג של Y-PLONI#5. אחר כך 8f0bbd8 הסיר אותה **והוריד את הלוכסן**, ו-a710b84 — אותו ענף, אותו יום — **החזיר את הלוכסן**; שניהם מוזגו ב-Y-PLONI#6, ונטו: הרשומה ירדה והמלכודת חזרה. שישה ימים אחר כך 2763bcb הכניס את הרשומה בחזרה (`node_modules | 1 +` יושב ב-stat שלו), ומשם ל-main ב-Y-PLONI#29. שני דברים שראוי לדעת על הסבב ההוא. **ההצדקה שם הייתה שגויה:** 8f0bbd8 נקרא „קובץ בשם node_modules חסם כל npm install”, וזה לא נכון — npm מתאושש, כפי שנמדד למעלה. **ול-a710b84 אין הסבר:** כותרתו היא „gitignore מתעלם רק מהתיקייה node_modules, לא מקובץ באותו שם”, כלומר תיאור הבעיה שהלוכסן יוצר — בקומיט שמחזיר את הלוכסן. ומאיפה זה חוזר: הקישור יושב בעץ העבודה של מי שיצר אותו, ו-`git add -A` שם מעלה אותו שוב. הלוכסן הוא מה שמאפשר לזה לקרות בשקט. ## למה `.gitignore` לא עצר את זה `node_modules/` — עם לוכסן — הוא **תבנית לתיקיות בלבד**. קישור סמלי אינו תיקייה, ולכן הוא לא הותאם ונוסף כמו כל קובץ אחר. נמדד עם קישור סמלי אמיתי בתוך clone של המאגר, בשני הכיוונים: עם לוכסן: ln -s … node_modules ; git add -A → M node_modules (120000) בלי לוכסן: ln -s … node_modules ; git add -A → שום דבר לא נבמה הלוכסן הוסר משלוש השורות ולא רק מזו שנשברה: `dist/` ו-`tmp/` הן אותה תבנית בדיוק, ולתקן אחת ולהשאיר שתיים זהות פירושו להשאיר את אותה מלכודת. ההרחבה נבדקה ולא הונחה — הפרש הקבוצות „מותאם בישן ולא בחדש” יצא ריק בשלוש התבניות, אין הרחבה לפי תת-מחרוזת (`distfile`, `my-dist`, `dist.js` אינם מותאמים לא לפני ולא אחרי), וכל 432 הקבצים המנוטרים נבדקו מול ה-`.gitignore` החדש ואף אחד אינו מותאם.
Nathaniel-260
force-pushed
the
fix/tracked-node-modules-symlink
branch
from
September 2, 2026 16:01
28892c1 to
7ecd56a
Compare
תוצאות בדיקת תוספי אוצריאמקור מפרט ה-API: GitHub (זמן אמת)
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
מה קרה
ב-
mainיש כרגע רשומה במצב120000— קישור סמלי — בשםnode_modules:זה הקישור הסמלי היחיד במאגר, בכל ההיסטוריה (
git ls-tree -rעל main: 432רשומות
100644ואחת120000).וזה כבר תוקן פעם אחת, ובוטל — זה החלק שחייב סקירה
הרשומה נוספה ב-37de9f7 ונכנסה ל-main במיזוג של #5. אחר כך:
node_modules/שניהם על
fix/word-double-click-selection, ומוזגו יחד ב-#6. התוצאהנטו של #6: הרשומה ירדה, המלכודת ב-
.gitignoreחזרה. שישה ימים אחר כך2763bcb — קומיט הייצוא ל-PDF, שבין קובצי ה-stat שלו יושבת השורה
node_modules | 1 +— הכניס אותה בחזרה, ומשם ל-main ב-#29.שתי הערות על הסבב הקודם, כי בלעדיהן אין סיבה שהפעם ייגמר אחרת:
8f0bbd8נקרא „קובץ בשם node_modules חסם כלnpm install”, וזה לא נכון — ראו הטבלה למטה: npm מתאושש. אם זו הייתה
הסיבה שהשינוי בוטל, ההצדקה כאן אחרת לגמרי ונמדדה.
a710b84אין הסבר. הכותרת שלו היא „gitignore מתעלם רק מהתיקייהnode_modules, לא מקובץ באותו שם” — כלומר תיאור הבעיה שהלוכסן יוצר,
בקומיט שמחזיר את הלוכסן. אם הייתה סיבה להחזיר אותו, היא אינה במאגר, ואני
אשמח לשמוע אותה לפני שזה נכנס.
ומאיפה זה חוזר: הקישור יושב בעץ העבודה של מי שיצר אותו, ו-
git add -Aשם מעלה אותו שוב. הלוכסן הוא מה שמאפשר לזה לקרות בשקט, ולכן הוא החצי החשוב
של ה-PR.
מה זה עושה, ומה זה לא
מוחק התקנות, בלי שום הודעה.
git checkout/git pullשל ה-main הזהבעץ עבודה שיש בו
node_modulesמותקן מחליף את התיקייה בקובץ של 70 בייט.זה קרה כאן, על עץ עבודה שדקות לפני כן הושלמה בו התקנה מלאה.
ולמה זה שקט:
node_modules/גורם לגיט להתעלם מהתיקייה, ולכן שומר„המחיקה הזאת תדרוס קבצים לא-מנוטרים” אינו חל.
checkoutיוצא 0 ולאמדפיס דבר. זה בדיוק הצירוף — הרשומה מצד אחד, ותבנית ההתעלמות מצד שני.
ב-Windows הרשומה מתממשת כקובץ טקסט שתוכנו הנתיב, מפני ש-
core.symlinks=falseבקונפיג המערכתי של Git for Windows. זו הגדרה, לא מגבלת מערכת הפעלה — המכונה
כן יוצרת קישורים סמליים, וגיט אכן מנטר אותם כ-
120000. ב-Unix הרשומהמתממשת כקישור תלוי שאינו מצביע לשום מקום.
אינו מפיל את ה-CI, וזו הסיבה שזה עבר.
npm ci/npm installמדווחnpm warn reify Removing non-directory …ומתאושש:npm installעם קובץ בשםnode_modulesadded 1 package, יציאה 0, עם אזהרהnpm ciבאותו מצבgit checkoutעל תיקייה מותקנתRelease@main על8c776e9וזה לא הבדל בין מערכות הפעלה: ב-
@npmcli/arboristהבדיקה היאlstat, ולכןקישור תלוי אינו נראה כתיקייה ונמחק באותו מסלול. הלוג של ה-Release על
8c776e9מדפיס את זה בעצמו:למה
.gitignoreלא עצר את זהnode_modules/— עם לוכסן — היא תבנית לתיקיות בלבד. קישור סמלי אינותיקייה, ולכן הוא לא הותאם ונוסף כמו כל קובץ אחר. נמדד עם קישור סמלי אמיתי
(לא קובץ שמדמה אותו), בשני הכיוונים, בתוך clone של המאגר עצמו:
מה יש כאן
שתי שורות:
git rm --cached node_modules— הרשומה יורדת מהמאגר..gitignore, ולא רק מזו שנשברה.dist/ו-
tmp/הן אותה תבנית בדיוק, ולתקן אחת ולהשאיר שתיים זהות פירושו להשאיראת אותה מלכודת בשני שמות אחרים.
וההרחבה נבדקה, לא הונחה. הפרש הקבוצות על קורפוס של תיקיות בשורש
ובעומק, קובץ רגיל, קישור לתיקייה, קישור לקובץ ונתיבים שאינם קיימים: „מותאם
בישן ולא בחדש” יצא ריק בשלוש התבניות. מה שנוסף: רק קובץ או קישור בשם
המדויק. אין הרחבה לפי תת-מחרוזת —
distfile,my-dist,dist.js,sub/tmp.jsonאינם מותאמים לא לפני ולא אחרי. וכל 432 הקבצים המנוטריםנבדקו מול ה-
.gitignoreהחדש:כל שימוש ב-
dist/tmpבפרויקט הוא תיקייה (join(ROOT,'dist')בכ-15 שערים),כלומר מותאם גם קודם. אין בעץ קובץ בשם
distאוtmp.אין שינוי בקוד, בתלויות או ב-CI.
מה צריך לעשות אחרי המיזוג
מי שכבר משך את
mainיקבל את המחיקה אוטומטית, אבל ההתקנה שלו כבר נמחקה —צריך
npm ciפעם אחת.