לאחר שלושה חודשים של פיתוח, פורסם שחרור מערכת בקרת המקור המבוזר Git 2.41. Git היא אחת ממערכות בקרת הגרסאות הפופולריות, האמינות ובעלי הביצועים הגבוהים ביותר המספקת כלי פיתוח גמישים לא ליניאריים המבוססים על הסתעפות ומיזוג סניפים. כדי להבטיח את שלמות ההיסטוריה והתנגדות לשינויים רטרואקטיביים, נעשה שימוש ב-hashing מרומז של כל ההיסטוריה הקודמת בכל commit, אפשר גם לאמת תגיות והתחייבויות בודדות עם חתימות דיגיטליות מהמפתחים.
בהשוואה למהדורה הקודמת, התקבלו לגרסה החדשה 542 שינויים שהוכנו בהשתתפות 95 מפתחים, מתוכם 29 לקחו חלק בפיתוח לראשונה. חידושים עיקריים:
- טיפול משופר באובייקטים בלתי ניתנים להשגה שאינם מוזכרים במאגר (אין הפניה לענפים או לתגים). חפצים שלא ניתן להגיע אליהם מוסרים על ידי אספן האשפה, אך נשארים במאגר למשך זמן מסוים לפני ההסרה כדי להימנע מתנאי מירוץ. כדי לעקוב אחר תקופת האובייקטים הבלתי ניתנים להשגה, יש צורך לקשור אליהם תוויות עם זמן השינוי של אובייקטים דומים, מה שלא מאפשר לאחסן אותם ב-pack-file אחד, שבו לכל האובייקטים יש זמן שינוי משותף. בעבר, כל אובייקט בלתי ניתן להשגה נשמר בקובץ נפרד, מה שהוביל לבעיות אם היו מספר רב של אובייקטים טריים בלתי ניתנים להשגה שעדיין לא היו נתונים למחיקה. במהדורה החדשה, כברירת מחדל, מנגנון "חבילות cruft" משמש לאריזת אובייקטים בלתי ניתנים להשגה, מה שמאפשר לאחסן את כל האובייקטים הבלתי ניתנים להשגה בקובץ חבילה אחד, ולשקף את הנתונים על זמן השינוי של כל אובייקט בטבלה נפרדת המאוחסנת בקובץ קובץ עם סיומת ".mtimes" ומקושר באמצעות קובץ אינדקס עם סיומת ".idx".

- כברירת מחדל, שמירה על אינדקס הפוך (revindex) בדיסק עבור קובצי חבילה מופעלת. כאשר נבדק על מאגרי torvalds/linux, השימוש באינדקס הפוך איפשר לנו להאיץ פעולות "git push" עתירות משאבים פי 1.49, ופעולות פשוטות, כמו חישוב גודל של אובייקט בודד באמצעות "git cat- file --batch='%(objectsize:disk)' » 77 פעמים. קבצים (".rev") עם אינדקס הפוך יאוחסנו בתוך המאגר בספריית ".git/objects/pack".
נזכיר ש-Git מאחסן את כל הנתונים בצורה של אובייקטים, שממוקמים בקבצים נפרדים. כדי להגביר את יעילות העבודה עם המאגר, אובייקטים ממוקמים בנוסף בקבצי חבילה, שבהם המידע מוצג בצורה של זרם אובייקטים העוקבים בזה אחר זה (בפורמט דומה משתמשים בהעברת אובייקטים עם ה-git fetch ו-git פקודות דחיפה). לכל קובץ חבילה נוצר קובץ אינדקס (.idx), המאפשר לקבוע במהירות רבה את ההיסט בקובץ ה-pack לפיו האובייקט הנתון מאוחסן על ידי מזהה האובייקט.
האינדקס ההפוך שנכלל במהדורה החדשה נועד לייעל את תהליך קביעת מזהה האובייקט מתוך מידע על מיקום האובייקט בקובץ החבילה. בעבר, המרה כזו בוצעה תוך כדי ניתוח של קובץ ה-pack ונשמרה רק בזיכרון, מה שלא איפשר שימוש חוזר באינדקסים כאלה ואילץ את האינדקס להיווצר בכל פעם. פעולת בניית האינדקס מצטמצמת לבניית מערך של זוגות מיקום אובייקט ומיון לפי מיקום, מה שיכול לקחת זמן רב עבור קבצי חבילה גדולים.
לדוגמה, פעולת הצגת התוכן של אובייקטים, המשתמשת באינדקס ישיר, הייתה מהירה פי 62 מפעולת הצגת הגודל של אובייקטים, שעבורם לא נוספו לאינדקס נתוני הקשר בין מיקום לאובייקט. לאחר השימוש במדד ההפוך, פעולות אלו החלו לקחת בערך באותו זמן. אינדקסים הפוכים גם מאפשרים לך להאיץ את פעולת שליחת האובייקטים בעת ביצוע פקודות אחזור ודחיפה על ידי העברה ישירה של נתונים מוכנים מהדיסק.

- נוספה תמיכה בהעברת כותרות WWW-Authenticate בין המטפל באישורים לבין שירות האימות לפרוטוקול "Credential Helper" המשמש להעברת אישורים בעת גישה למאגרים מוגבלים. תמיכה בכותרת WWW-Authenticate מאפשרת להעביר פרמטרים של היקף OAuth לגישה נפרדת יותר של משתמשים למאגרים ולתחום את ההיקף הזמינים לבקשות.
- נוספה אפשרות פורמט "%(ahead-behind: )", המאפשר לקבל מיד מידע על מספר המחוייבים הקיימים או נעדרים בסניף מסוים, ביחס לסניף אחר (עד כמה סניף אחד מפגר או לפני אחר ברמת ההתחייבויות). בעבר, קבלת המידע הזה דרשה שתי פקודות נפרדות: "git rev-list --count main..my-feature" כדי לקבל את מספר ההתחייבויות הייחודיות לסניף, ו-"git rev-list --count my-feature.. main" כדי לקבל את המספר החסר commits. כעת ניתן לצמצם חישובים כאלה להוראה אחת, מה שמפשט את מטפלי הכתיבה ומצמצם את זמן הביצוע. לדוגמה, כדי להציג סניפים שלא ממוזגים ולהעריך אם הם נמצאים מאחורי או לפני הסניף הראשי שלהם, אתה יכול להשתמש ב-one liner: $ git for-each-ref --no-merged=origin/HEAD \ --format=' %(refname:short) %(ahead-behind :origin/HEAD)' \ refs/heads/tb/ | עמודה -t tb/cruft-extra-tips 2 96 tb/for-each-ref—אל תכלול 16 96 tb/roaring-bitmaps 47 3 במקום הסקריפט שנעשה בו שימוש קודם, שהוא איטי פי 17: $ git for-each-ref - format='%(refname:short)' --no-merged=origin/HEAD \ refs/heads/tb | while read ref do ahead="$(git rev-list --count origin/HEAD..$ref)" behind="$(git rev-list --count $ref..origin/HEAD)" printf "%s %d %d\n" "$ref" "$ahead" "$behind" בוצע | עמודה -t tb/cruft-extra-tips 2 96 tb/for-each-ref—אל תכלול 16 96 tb/roaring-bitmaps 47 3
- נוספה אפשרות "--porcelain" לפקודת "git fetch", המייצרת פלט בפורמט " ”, פחות קריא, אבל נוח יותר לניתוח בסקריפטים.
- נוספה ההגדרה "fetch.hideRefs", המאפשרת לך להאיץ פעולות "git fetch" על ידי הסתרת חלק מההפניות במאגר המקומי במהלך שלב הבדיקה האם השרת שלח סט מלא של אובייקטים, מה שמאפשר לך לחסוך זמן על ידי הגבלת הבדיקה רק ל- שרתים, שממנו נתונים מופקים ישירות. לדוגמה, בעת הפעלת בדיקה על מערכת עם מאגרים המכילים מספר רב של קישורים חיצוניים שעוקבים אחריהם, אי הכללת כל הקישורים מלבד אלה המופנים ליעד שרת $remote, הפחת את זמן הביצוע של פעולת "git fetch" מ-20 דקות ל-30 שניות. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
- הפקודה "git fsck" מיישמת את היכולת לבדוק אם יש שחיתות, התאמת סכום בדיקה ונכונות ערכים במפות סיביות של נגישות ובאינדקסים הפוכים.
- הפקודה "git clone --local" מציגה כעת שגיאה בעת ניסיון להעתיק ממאגר המכיל קישורים סמליים בתוך $GIT_DIR.
מקור: OpenNet.ru


