ניסית להשתמש ב hooks ? לדוגמא server side hook שנקרא update ?
פה יש דוגמא ל client side hook שמשנה את ה commit msg : https://git-scm.com/book/en/v2/Customizing-Git-An-Example-Git-Enforced-Policy On Tue, Feb 19, 2019 at 7:18 PM Tomer Brisker <tbris...@gmail.com> wrote: > הי צפריר, > > אכן שאלה מעניינת. > קח בחשבון שהhash כולל בתהליך החישוב שלו גם את ה-timestamp של הקומיט, כך > שגם אם תמצא commit message שעונה על התנאי, לא תוכל לשחזר את התוצאה בריצה > מאוחרת יותר. > מכיוון שאתה לא משנה את ה tree אלא רק את הודעת הקומיט עצמו, יתכן שתוכל לחשב > את ה hash מבלי ליצור קומיט של ממש באמצעות git hash-object או פקודה דומה. > לפרטים נוספים על איך המימוש הפנימי של כל האובייקטים עובד, ממליץ על הפרק > הבא: https://git-scm.com/book/en/v2/Git-Internals-Git-Objects > > On Tue, 19 Feb 2019 at 13:56, Tzafrir Cohen <tzaf...@cohens.org.il> wrote: > >> שלום, >> >> >> השאלה שלי סוטה מהכיוון הכללי של הרשימה הזו בזמן האחרון ולמרבה הפליאה לא >> קשורה לאף ידיעה ב־ynet. >> >> >> אני מנסה לעשות משהו קצת דבילי: יש לי מאגר גיט קטן ואני מנסה לדאוג שה־hash >> של ה־commit האחרון יהיה מה שבחרתי. ליתר דיוק: הגרסה המקוצרת שלו: מכיוון >> שזהו מאגר קטן, מדובר על המינימום: שבעה תווי hex. כלומר: 16^7או 2^28. זה >> כבר בתחום המעשי. >> >> >> התחלתי מהסקריפט הבא: >> >> #!/bin/bash >> >> target="f00ba11" >> >> max=$((16 ** 7)) >> >> commit_str() { >> git show -s --'pretty=tformat:%h' HEAD >> } >> >> commit_template="commit message title >> >> Try ____ >> >> " >> >> for i in `seq $max`; do >> >> if [ `commit_str` = "$target" ]; then >> >> break >> >> fi >> >> commit_msg=${commit_template/____/$i} >> >> git commit --amend -m "$commit_msg" >> >> echo -n "." >> >> done >> >> >> הבעיה הראשונה הייתה לולאת ה־for ו־seq. הפלט שלו ענקי וזה מפוצץ את תהליך >> באש עצמו (המכונה שלי הייתה קצת חנוקה עם זכרון). הפכתי את זה ללולאת for >> רגילה יותר (לא היה לי כוח לבדוק אם לבאש יש משהו משלו): >> >> i=0 >> while [ $i -lt $max ]; do >> >> if [ `commit_str` = "$target" ]; then >> >> break >> >> fi >> >> commit_msg=${commit_template/____/$i} >> >> git commit --amend -m "$commit_msg" >> >> echo -n "." >> : $((i++)) >> >> done >> >> >> >> בשלב הזה ראיתי מהו הקצב, והחלטתי שהוא לא מספיק טוב ושאני יכול להריץ כמה >> במקביל. העתקתי את התיקיה לעוד שלושה עותקים. לכל אחד שמתי קובץ בשם base_num, >> בהתחלה קראתי את תוכנו למשתנה, ועכשיו שורת יצירת התבנית הפכה להיות: >> >> commit_msg=${commit_template/____/$base_num:$i} >> >> ואז שמתי לב שהאורך של ה־hash שמוצג לי כבר גדול מ־7. זה מוזר: נכון שאני >> מייצר כל הזמן commit־ים לא מחוברים בכל הרצה של הלולאה, אבל מדי פעם רץ git >> gc והוא אמור להיפטר מהם. ואז הבנתי שלא: >> >> 1. ה־reflog ממשיך להתייחס אליהם. >> >> 2. git gc מעיף אוטומטית רק commits בני שבועיים ויותר. >> >> >> צריך להשתמש ב־git reflog expire: להגיד לו גם להתייחס לכל תוכן ה־log וגם >> להפטר מכל מה שהוא מוצא, ולא רק מהישנים. את השינוי הבא לא להעתיק למקום אחר >> אם אתם לא מבינים מה הוא עושה. >> >> באותה הזדמנות הוספתי גם קובץ בשם start שמוסיף את הערך שממנו צריך להתחיל >> בפעם הבאה שמריצים (אם אני מפסיק באמצע). >> >> i=`cat start` >> while [ $i -lt $max ]; do >> >> if [ `commit_str` = "$target" ]; then >> >> break >> >> fi >> >> commit_msg=${commit_template/____/$i} >> >> git commit --amend -m "$commit_msg" >> case "$i" in *0000) >> git reflog expire --all --expire=all >> git gc --prune=all >> echo $i >start >> ;; >> >> esac >> >> echo -n "." >> : $((i++)) >> >> done >> >> >> לא מצאתי איך אפשר לעשות commit ללא עדכון ה־reflog. האם זה אפשרי? >> >> >> וכן, אני מניח שזו לא הדרך היעילה ביותר לעשות את זה. הצעות לדרכים יעילות >> יותר יתקבלו בברכה. >> >> >> -- צפריר >> _______________________________________________ >> Discussions mailing list >> Discussions@hamakor.org.il >> http://hamakor.org.il/cgi-bin/mailman/listinfo/discussions > > > > -- > יום טוב, > תומר בריסקר > > _______________________________________________ > Discussions mailing list > Discussions@hamakor.org.il > http://hamakor.org.il/cgi-bin/mailman/listinfo/discussions
_______________________________________________ Discussions mailing list Discussions@hamakor.org.il http://hamakor.org.il/cgi-bin/mailman/listinfo/discussions