คำแนะนำที่คุณได้รับมีข้อบกพร่อง การตั้งค่าโดยไม่มีเงื่อนไข GIT_AUTHOR_DATE ในการ--env-filter
จะเขียนวันที่ของการกระทำทุกครั้ง นอกจากนี้ก็จะมีความผิดปกติในการใช้คอมไพล์กระทำ--index-filter
ภายใน
คุณกำลังเผชิญกับปัญหาอิสระมากมายที่นี่
การระบุวันที่นอกเหนือจาก“ ตอนนี้”
แต่ละการกระทำมีสองวันที่: วันที่ผู้เขียนและวันที่ผู้ส่ง คุณสามารถลบล้างแต่ละค่าได้ด้วยการจัดหาค่าผ่านตัวแปรสภาพแวดล้อม GIT_AUTHOR_DATE และ GIT_COMMITTER_DATE สำหรับคำสั่งใด ๆ ที่เขียนคอมมิทใหม่ ดู“ รูปแบบวันที่” ใน git-commit (1)หรือด้านล่าง:
Git internal format = <unix timestamp> <time zone offset>, e.g. 1112926393 +0200
RFC 2822 = e.g. Thu, 07 Apr 2005 22:13:13 +0200
ISO 8601 = e.g. 2005-04-07T22:13:13
คำสั่งเดียวที่เขียนคอมมิทใหม่ระหว่างการใช้งานปกติคือคอมมิทคอมมิท นอกจากนี้ยังมี--date
ตัวเลือกที่ให้คุณระบุวันที่ของผู้แต่งได้โดยตรง การใช้งานที่คาดว่าจะของคุณรวมถึงgit filter-branch --env-filter
ยังใช้ตัวแปรสภาพแวดล้อมดังกล่าวข้างต้น (เหล่านี้เป็นส่วนหนึ่งของ“env” หลังจากที่ตัวเลือกในการตั้งชื่อดู“ตัวเลือก” ในคอมไพล์กรองสาขา (1)และพื้นฐาน“ประปา” คำสั่งคอมไพล์กระทำ -tree (1)
การแทรกไฟล์ลงในประวัติอ้างอิงเดียว
หากพื้นที่เก็บข้อมูลของคุณง่ายมาก (เช่นคุณมีเพียงสาขาเดียวไม่มีแท็ก) ดังนั้นคุณสามารถใช้การรีบูต gitเพื่อทำงาน
ในคำสั่งต่อไปนี้ใช้ชื่อวัตถุ (แฮช SHA-1) ของการคอมมิทแทนที่จะเป็น "A" อย่าลืมใช้วิธีการ“ ลบล้างวันที่” หนึ่งในวิธีที่คุณรันคอมมิทคอมมิท
---A---B---C---o---o---o master
git checkout master
git checkout A~0
git add path/to/file
git commit --date='whenever'
git tag ,new-commit -m'delete me later'
git checkout -
git rebase --onto ,new-commit A
git tag -d ,new-commit
---A---N (was ",new-commit", but we delete the tag)
\
B'---C'---o---o---o master
หากคุณต้องการที่จะอัปเดตที่จะรวมไฟล์ใหม่ (แทนการสร้างใหม่การกระทำที่มันถูกเพิ่ม) แล้วใช้แทนgit commit --amend
git commit
ผลลัพธ์จะเป็นดังนี้:
---A'---B'---C'---o---o---o master
งานด้านบนตราบใดที่คุณสามารถตั้งชื่อการส่งมอบที่ควรจะเป็นรายการหลักของการส่งมอบใหม่ของคุณ หากคุณต้องการให้ไฟล์ใหม่ของคุณเพิ่มผ่านรูทการคอมมิทใหม่ (ไม่มีพาเรนต์) แสดงว่าคุณต้องการไฟล์ที่ต่างออกไป
B---C---o---o---o master
git checkout master
git checkout --orphan new-root
git rm -rf .
git add path/to/file
GIT_AUTHOR_DATE='whenever' git commit
git checkout -
git rebase --root --onto new-root
git branch -d new-root
N (was new-root, but we deleted it)
\
B'---C'---o---o---o master
git checkout --orphan
ค่อนข้างใหม่ (Git 1.7.2) แต่มีวิธีอื่นในการทำสิ่งเดียวกันกับ Git รุ่นเก่า
การแทรกไฟล์ลงในแบบ Multi เตะประวัติศาสตร์
หากพื้นที่เก็บข้อมูลของคุณเป็นเรื่องที่ซับซ้อนมากขึ้น (คือมันมีมากกว่าหนึ่งโทษ (สาขา, แท็ก ฯลฯ )) แล้วคุณอาจจะต้องใช้คอมไพล์กรองสาขา ก่อนที่จะใช้สาขาตัวกรอง gitคุณควรทำสำเนาสำรองของพื้นที่เก็บข้อมูลทั้งหมดของคุณ ไฟล์เก็บถาวรtarแบบง่าย ๆของแผนผังการทำงานทั้งหมดของคุณ (รวมถึงไดเรกทอรี. git) ก็เพียงพอแล้ว สาขาตัวกรอง gitทำการอ้างอิงสำรอง แต่มักจะกู้คืนได้ง่ายขึ้นจากการกรองที่ไม่ถูกต้องโดยเพียงแค่ลบ.git
ไดเรกทอรีของคุณและเรียกคืนจากการสำรองข้อมูลของคุณ
หมายเหตุ: ตัวอย่างด้านล่างใช้คำสั่งระดับล่างแทนgit update-index --add
git add
คุณสามารถใช้การเพิ่ม gitแต่ก่อนอื่นคุณต้องคัดลอกไฟล์จากตำแหน่งภายนอกไปยังเส้นทางที่คาดไว้ ( --index-filter
เรียกใช้คำสั่งใน GIT_WORK_TREE ชั่วคราวที่ว่างเปล่า)
หากคุณต้องการให้ไฟล์ใหม่ของคุณถูกเพิ่มลงในการคอมมิทที่มีอยู่ทั้งหมดคุณสามารถทำได้:
new_file=$(git hash-object -w path/to/file)
git filter-branch \
--index-filter \
'git update-index --add --cacheinfo 100644 '"$new_file"' path/to/file' \
--tag-name-filter cat \
-- --all
git reset --hard
--env-filter 'GIT_AUTHOR_DATE=…'
ผมไม่เห็นเหตุผลที่จะเปลี่ยนวันของการกระทำที่มีอยู่กับใด ๆ ถ้าคุณใช้มันคุณจะทำให้มันมีเงื่อนไขเพื่อที่มันจะได้เขียนวันที่สำหรับทุกการกระทำ
หากคุณต้องการให้ไฟล์ใหม่ของคุณปรากฏเฉพาะในคอมมิทหลังจากการคอมมิทที่มีอยู่ (“ A”) คุณสามารถทำได้ดังนี้:
file_path=path/to/file
before_commit=$(git rev-parse --verify A)
file_blob=$(git hash-object -w "$file_path")
git filter-branch \
--index-filter '
if x=$(git rev-list -1 "$GIT_COMMIT" --not '"$before_commit"') &&
test -n "$x"; then
git update-index --add --cacheinfo 100644 '"$file_blob $file_path"'
fi
' \
--tag-name-filter cat \
-- --all
git reset --hard
หากคุณต้องการเพิ่มไฟล์ผ่านการคอมมิทใหม่ที่จะถูกแทรกลงในช่วงกลางของประวัติของคุณคุณจะต้องสร้างการคอมมิทใหม่ก่อนที่จะใช้git filter-branchและเพิ่ม--parent-filter
ไปยังgit filter-branch :
file_path=path/to/file
before_commit=$(git rev-parse --verify A)
git checkout master
git checkout "$before_commit"
git add "$file_path"
git commit --date='whenever'
new_commit=$(git rev-parse --verify HEAD)
file_blob=$(git rev-parse --verify HEAD:"$file_path")
git checkout -
git filter-branch \
--parent-filter "sed -e s/$before_commit/$new_commit/g" \
--index-filter '
if x=$(git rev-list -1 "$GIT_COMMIT" --not '"$new_commit"') &&
test -n "$x"; then
git update-index --add --cacheinfo 100644 '"$file_blob $file_path"'
fi
' \
--tag-name-filter cat \
-- --all
git reset --hard
นอกจากนี้คุณยังสามารถจัดสำหรับแฟ้มที่จะเพิ่มครั้งแรกในรากใหม่กระทำ: สร้างรากใหม่ของคุณกระทำผ่านทาง“เด็กกำพร้า” วิธีการจากคอมไพล์ rebaseส่วน (จับภาพในnew_commit
) ให้ใช้อย่างไม่มีเงื่อนไข--index-filter
และชอบ--parent-filter
"sed -e \"s/^$/-p $new_commit/\""