Skip to content

node_modules נכנס למאגר כקישור סמלי, ומאז כל checkout מוחק התקנה - #30

Merged
Y-PLONI merged 1 commit into
Y-PLONI:mainfrom
Nathaniel-260:fix/tracked-node-modules-symlink
Sep 2, 2026
Merged

node_modules נכנס למאגר כקישור סמלי, ומאז כל checkout מוחק התקנה#30
Y-PLONI merged 1 commit into
Y-PLONI:mainfrom
Nathaniel-260:fix/tracked-node-modules-symlink

Conversation

@Nathaniel-260

@Nathaniel-260 Nathaniel-260 commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

מה קרה

ב-main יש כרגע רשומה במצב 120000 — קישור סמלי — בשם node_modules:

$ git ls-tree upstream/main node_modules
120000 blob b8c0157ec3efaca3f8cf1c35a0b68020bbf0d865	node_modules

$ git cat-file -p b8c0157
/Users/david/Documents/otzaria-others/otzaria-word-editor/node_modules

זה הקישור הסמלי היחיד במאגר, בכל ההיסטוריה (git ls-tree -r על main: 432
רשומות 100644 ואחת 120000).

וזה כבר תוקן פעם אחת, ובוטל — זה החלק שחייב סקירה

הרשומה נוספה ב-37de9f7 ונכנסה ל-main במיזוג של #5. אחר כך:

קומיט מה עשה
8f0bbd8 (27.8) הסיר את הרשומה, והוריד את הלוכסן מ-node_modules/
a710b84 (27.8, אותו ענף, אותו יום) החזיר את הלוכסן

שניהם על fix/word-double-click-selection, ומוזגו יחד ב-#6. התוצאה
נטו של #6: הרשומה ירדה, המלכודת ב-.gitignore חזרה. שישה ימים אחר כך
2763bcb — קומיט הייצוא ל-PDF, שבין קובצי ה-stat שלו יושבת השורה
node_modules | 1 + — הכניס אותה בחזרה, ומשם ל-main ב-#29.

שתי הערות על הסבב הקודם, כי בלעדיהן אין סיבה שהפעם ייגמר אחרת:

  1. ההצדקה שם הייתה שגויה. 8f0bbd8 נקרא „קובץ בשם node_modules חסם כל
    npm install”, וזה לא נכון — ראו הטבלה למטה: npm מתאושש. אם זו הייתה
    הסיבה שהשינוי בוטל, ההצדקה כאן אחרת לגמרי ונמדדה.
  2. ל-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_modules added 1 package, יציאה 0, עם אזהרה
npm ci באותו מצב יציאה 0, אותה אזהרה
git checkout על תיקייה מותקנת ההתקנה מוחלפת בקובץ, יציאה 0, בלי אזהרה
Release @main על 8c776e9 ירוק

וזה לא הבדל בין מערכות הפעלה: ב-@npmcli/arborist הבדיקה היא lstat, ולכן
קישור תלוי אינו נראה כתיקייה ונמחק באותו מסלול. הלוג של ה-Release על
8c776e9 מדפיס את זה בעצמו:

npm warn reify Removing non-directory /home/runner/work/otzaria-word-editor/otzaria-word-editor/node_modules

למה .gitignore לא עצר את זה

node_modules/עם לוכסן — היא תבנית לתיקיות בלבד. קישור סמלי אינו
תיקייה, ולכן הוא לא הותאם ונוסף כמו כל קובץ אחר. נמדד עם קישור סמלי אמיתי
(לא קובץ שמדמה אותו), בשני הכיוונים, בתוך clone של המאגר עצמו:

עם לוכסן:   ln -s … node_modules ; git add -A  →  M node_modules  (120000)
בלי לוכסן:  ln -s … node_modules ; git add -A  →  שום דבר לא נבמה

מה יש כאן

שתי שורות:

  • git rm --cached node_modules — הרשומה יורדת מהמאגר.
  • הלוכסן יורד משלוש השורות ב-.gitignore, ולא רק מזו שנשברה. dist/
    ו-tmp/ הן אותה תבנית בדיוק, ולתקן אחת ולהשאיר שתיים זהות פירושו להשאיר
    את אותה מלכודת בשני שמות אחרים.

וההרחבה נבדקה, לא הונחה. הפרש הקבוצות על קורפוס של תיקיות בשורש
ובעומק, קובץ רגיל, קישור לתיקייה, קישור לקובץ ונתיבים שאינם קיימים: „מותאם
בישן ולא בחדש” יצא ריק בשלוש התבניות. מה שנוסף: רק קובץ או קישור בשם
המדויק. אין הרחבה לפי תת-מחרוזת — distfile, my-dist, dist.js,
sub/tmp.json אינם מותאמים לא לפני ולא אחרי. וכל 432 הקבצים המנוטרים
נבדקו מול ה-.gitignore החדש:

$ git ls-files | git check-ignore --no-index --stdin -v
exit=1      # אף אחד לא מותאם

כל שימוש ב-dist/tmp בפרויקט הוא תיקייה (join(ROOT,'dist') בכ-15 שערים),
כלומר מותאם גם קודם. אין בעץ קובץ בשם dist או tmp.

אין שינוי בקוד, בתלויות או ב-CI.

מה צריך לעשות אחרי המיזוג

מי שכבר משך את main יקבל את המחיקה אוטומטית, אבל ההתקנה שלו כבר נמחקה —
צריך npm ci פעם אחת.

ב-`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
Nathaniel-260 force-pushed the fix/tracked-node-modules-symlink branch from 28892c1 to 7ecd56a Compare September 2, 2026 16:01
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown

תוצאות בדיקת תוספי אוצריא

מקור מפרט ה-API: GitHub (זמן אמת)

תוסף שגיאות אזהרות עיצוב סטטוס
וורד לאוצריא (com.otzaria_word_editor.superdoc) 0 0 5

הרצה מלאה

@Y-PLONI
Y-PLONI merged commit 20b59d3 into Y-PLONI:main Sep 2, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants