שגיאות Git

איך לתקן את שגיאת “would clobber existing tag” ב־Git.

FluxGit ·

Git מציג “would clobber existing tag” כאשר פעולת fetch עומדת להחליף תג מקומי קיים באובייקט אחר. השוו את הפניות התג ושמרו את ההפניה המקומית. עדכנו רק את התג הזה, ורק לאחר שאימתתם שהגרסה המרוחקת היא הגרסה הנכונה.

הדרך הבטוחה לטפל בשגיאה

אתרו את התג שמופיע בשגיאה. השוו את מזהי האובייקטים המקומיים והמרוחקים וצרו גיבוי מקומי. רק אם הגרסה המרוחקת נכונה, בצעו fetch כפוי של אותו תג שאימתתם. אל תכפו עדכון של כל התגים ואל תדחפו תג חלופי למאגר המרוחק.

לתגים עם הערות יש מזהי אובייקטים משלהם. שני אובייקטים של תג יכולים להצביע לאותו commit אך להכיל הודעה או חתימה שונות. השוו את הפניות התגים ואת אובייקטי היעד שמתקבלים לאחר הסרת שכבת התג, לפני שתחליטו מה השתנה.

1. בדקו את התג המדויק

החליפו את v1.2.3 בתג שמופיע בשגיאה ואת origin בשם המאגר המרוחק שלכם. הפקודות האלה אינן משנות הפניות.

git show-ref --verify refs/tags/v1.2.3
git rev-parse 'refs/tags/v1.2.3^{}'
git ls-remote --tags origin 'refs/tags/v1.2.3' 'refs/tags/v1.2.3^{}'

הפקודה הראשונה מציגה את מזהה אובייקט התג המקומי. השנייה מסירה את שכבת התג עם ההערות כדי למצוא את אובייקט היעד. הפלט המרוחק מציג את הפניית התג, ובתג עם הערות גם שורה שמסתיימת ב־^{} ומציגה את היעד לאחר הסרת שכבת התג.

השתמשו בשמות ההפניות המלאים שמופיעים כאן. חיפוש לפי הקידומת v1.2.3 עלול לכלול גם את v1.2.30. אם במאגר המרוחק אין תג תואם, עצרו; ההליך הזה אינו סיבה למחוק את התג המקומי.

2. שמרו את ההפניה המקומית המקורית

צרו תג שחזור מקומי לפני החלפה של דבר כלשהו. הארגומנט הריק האחרון מחייב ששם הגיבוי עדיין אינו בשימוש.

git update-ref refs/tags/backup/v1.2.3 refs/tags/v1.2.3 ""
git rev-parse refs/tags/v1.2.3 refs/tags/backup/v1.2.3

שני מזהי האובייקטים חייבים להיות זהים. כך נשמר אובייקט התג המקורי, כולל ההודעה והחתימה של תג עם הערות. אם יצירת הגיבוי נכשלת כי הוא כבר קיים, בחרו שם גיבוי חדש ואמתו אותו לפני שתמשיכו.

שמרו את הגיבוי עד שההבדל ייפתר. הוא נשאר מקומי אלא אם תדחפו אותו; אל תשתמשו ב־git push --tags לצורך התיקון הזה.

3. עדכנו רק את התג שאימתתם

הריצו זאת רק לאחר שאימתתם שהתג המרוחק הוא הגרסה הנכונה ושהגיבוי קיים. הסימן + בתחילת ההפניה מתיר להחליף רק את ההפניה המקומית המסוימת הזאת.

git fetch --no-tags --no-prune --no-prune-tags origin '+refs/tags/v1.2.3:refs/tags/v1.2.3'
git show-ref --verify refs/tags/v1.2.3
git rev-parse 'refs/tags/v1.2.3^{}'

--no-tags משבית מעקב אוטומטי אחר תגים אחרים. --no-prune ו־--no-prune-tags משביתים את ניקוי ההפניות שהוגדר עבור פעולת fetch זו, כדי שהיקף התיקון לא יתרחב. הפעולה אינה דוחפת או מחליפה ענף או תג במאגר המרוחק.

השוו את אובייקט התג שהובא ואת היעד שלו לאחר הסרת שכבת התג למזהים המרוחקים שבדקתם. אם המאגר המרוחק השתנה במהלך התיקון, עצרו ובדקו את הסיבה לפני שתשתמשו בתג לשחרור גרסה. הגיבוי עדיין מצביע לאובייקט המקורי.

למה Git דוחה את העדכון

החל מ־Git 2.20, פעולת fetch דורשת הרשאה מפורשת לעדכון כפוי כדי להחליף הפניה קיימת תחת refs/tags/*. הכלל חל גם אם יש יחס של אב־קדמון בין שני commit היעד; תגים אינם מתעדכנים לפי כללי fast-forward של ענפים.

אם התג המקומי מייצג את הגרסה הנכונה, שמרו אותו ותאמו עם המתחזק. החלפת תג מרוחק שכבר פורסם משנה את מה שמשתמשים אחרים מקבלים תחת אותו שם גרסה.

מקורות Git רשמיים

הבינו את מצב המאגר

בדקו קודם, ואז שנו רק את ההפניה הנחוצה.

FluxGit מרכז תגים, בדיקות מצב של מאגרים ופעולות עם מנגנוני בקרה בלקוח Git שולחני ל־macOS, ל־Windows ול־Linux. השתמשו בפקודות שלמעלה לאבחון שגיאת Git זו לפני שינוי של הפניה.

משאבים קשורים (באנגלית)