ลบชุดการเปลี่ยนแปลงในเครื่องทั้งหมดและเปลี่ยนกลับเป็นโครงสร้าง


95

ฉันใช้ Mercurial และฉันมีปัญหาในท้องถิ่นอย่างมากโดยมีสามหัว ฉันไม่สามารถผลักดันได้และฉันแค่ต้องการลบการเปลี่ยนแปลงในเครื่องทั้งหมดของฉันและยอมรับและเริ่มต้นใหม่อีกครั้งด้วยรหัสที่สะอาดหมดจดและประวัติที่สะอาด

กล่าวอีกนัยหนึ่งฉันต้องการลงท้ายด้วย (a) รหัสในเครื่องเดียวกันกับที่มีอยู่ในส่วนปลายของสาขาระยะไกลและ (b) ไม่มีประวัติของการกระทำใด ๆ ในท้องถิ่น

ฉันรู้ว่าhg update -Cเขียนทับการเปลี่ยนแปลงในเครื่อง แต่ฉันจะลบคอมมิตในเครื่องได้อย่างไร?

เพื่อความชัดเจนฉันไม่มีความสนใจที่จะรักษางานใด ๆ ที่ฉันทำในท้องถิ่น ฉันต้องการวิธีที่ง่ายที่สุดในการเปลี่ยนกลับไปใช้การชำระเงินในท้องถิ่นที่สะอาด


คำตอบ:


129

เมื่อวิธีที่ง่ายที่สุด (ใหม่hg clone) ไม่สามารถใช้ได้จริงฉันใช้hg strip:

% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

ทำซ้ำจนกว่าhg outgoingจะเงียบ โปรดสังเกตว่าจะhg strip $revลบล้าง$revและลูกหลานทั้งหมด

โปรดทราบว่าคุณอาจจะต้องเปิดใช้งานครั้งแรกstripในการตั้งค่า Mercurial ของคุณ

PS:วิธีการที่ชาญฉลาดยิ่งขึ้นคือการใช้ภาษา revset และทำ:

% hg strip 'roots(outgoing())'

1
ขอบคุณ! ฉันจบลงในสถานการณ์ที่สิ่งนี้แก้ไขได้อย่างสมบูรณ์แบบโดยไม่ต้องเอะอะ
eswald

1
สิ่งนี้ช่วยฉันจากการแก้ไขขนาดใหญ่ข้างต้นง่ายมากขอบคุณ!
David C

3
ถ้าใครมีปัญหาในการที่จะทำงานเพราะมันไม่ได้ตระหนักถึงhg strip 'roots(outgoing())' 'roots(outgoing())'ฉันสามารถทำให้มันใช้งานhg strip "roots(outgoing())"ได้
jsea

@SombreErmine cmd.exeค่ะ
just somebody

21

คุณจะต้องสร้างโลคัลโคลนที่คุณเก็บเฉพาะชุดการเปลี่ยนแปลงที่มีอยู่ในที่เก็บระยะไกล ใช้TortoiseHg , hg logหรือคล้ายกันที่จะคิดออกซึ่งของการแก้ไขของคุณคือการแก้ไขล่าสุดที่คุณไม่ได้ทำ (หนึ่งก่อนที่ระเบียบเริ่มต้น) การใช้hg outgoingสามารถช่วยได้ที่นี่ - จะแสดงรายการการเปลี่ยนแปลงทั้งหมดที่คุณทำ - เลือกหมายเลขการแก้ไขก่อนหน้านี้

หากมีการเรียกการแก้ไขเป้าหมายและมีการเรียกgoodโคลนของคุณfooให้ทำ:

hg clone -r good foo foo-clean

นี้จะเป็นไปอย่างรวดเร็วและการดำเนินงานในท้องถิ่น - มีเหตุผลที่จะดาวน์โหลดทุกอย่างไม่มีอีกครั้ง โคลนเท่านั้นที่จะมีการแก้ไขถึงการแก้ไขfoo-clean goodตอนนี้คุณสามารถแทนที่foo-clean/.hg/hgrcด้วยfoo/.hg/hgrcเพื่อรักษาการตั้งค่าพื้นที่เก็บข้อมูลของคุณเช่นเส้นทางพุช / ดึงเริ่มต้น

เมื่อคุณมีความพึงพอใจที่foo-cleanมีทุกสิ่งที่คุณต้องการจากfooนั้นเพียงแค่ลบfooและเปลี่ยนชื่อไปfoo-clean fooทำhg pullเพื่อรับชุดการเปลี่ยนแปลงใหม่ ๆ จากที่เก็บระยะไกลไปยังโคลนของคุณและดำเนินการต่อตามปกติ


หากไม่มีใครพุชชุดการเปลี่ยนแปลงใหม่ไปยังที่เก็บระยะไกลการพิจารณาว่าคุณต้องการใช้การแก้ไขใดดังที่กล่าวมาgoodข้างต้นนั้นง่ายมาก: hg id defaultจะบอก ID ของเคล็ดลับในที่เก็บระยะไกล


ฉันมีสถานการณ์เดียวกัน แต่ก็มีไฟล์จำนวนมากในไดเร็กทอรี repo แต่อยู่ใน hgignore ไม่สามารถติดตั้ง hg strip และต้องการวางคอมมิทภายในเครื่องโดยไม่ต้องแทนที่โคลนทั้งหมด ความคิดใด ๆ ? -- อา! หากฉันยังไม่ได้เพิ่มไฟล์ใด ๆ ฉันควรจะสามารถคัดลอกโคลนอื่นลงในไดเร็กทอรีเก่าของฉันได้!?
Peteter

ระวังด้วยวิธีนี้หากคุณมีหลายสาขา การโคลนถึงการแก้ไขที่ระบุจะได้รับชุดการเปลี่ยนแปลงในสาขาของการแก้ไขที่ระบุเท่านั้น จากนั้นคุณอาจต้องhg pull -rแก้ไข "ดี" ครั้งสุดท้ายของแต่ละสาขาเพิ่มเติม
Yitz

9

ตกลง. ดังนั้นเพียงแค่ลบข้อมูลในเครื่องทั้งหมดที่hg initเก็บในเครื่องใหม่และhg pullเคล็ดลับล่าสุดที่คุณมี อย่าลืมhg updateหลังจากนี้


ขอบคุณ. เมื่อคุณพูดว่า 'ลบข้อมูลในเครื่องทั้งหมด' คุณหมายถึงลบที่เก็บทั้งหมดหรือแค่การเปลี่ยนแปลงของฉัน? hg init ทำอะไร (มี Googled แต่ไม่เห็นคำอธิบายง่ายๆ) และฉันต้องใช้แฟล็กใด ๆ กับมันหรือไม่ จะลบสิ่งต่างๆเช่นการตั้งค่า Mercurial .hgrc ของฉันหรือไม่
Richard

อัปเดต: ถ้าฉันลบทุกอย่างในไดเร็กทอรีรูทของโปรเจ็กต์จากนั้นพิมพ์ 'hg init' ฉันจะได้รับ 'abort: repository มีอยู่แล้ว!'. ฉันต้องตั้งค่าและทำงานจากไดเร็กทอรีใหม่หรือไม่? ไม่อยากเลยถ้าเป็นไปได้ ... ต้องมีวิธีง่ายๆในการฆ่าทุกสิ่งที่ฉันทำในท้องถิ่น!
Richard

ใช่ลบทุกอย่างรวมทั้งข้อมูลที่เก็บทั้งหมด เริ่มจากโฟลเดอร์ใหม่ที่สะอาด ค่ากำหนดของคุณคุณสามารถบันทึกในไฟล์สำรองข้อมูลจากนั้นเรียกคืนไปยังที่เก็บใหม่ที่คุณสร้างด้วย hg init reponame Details on init and stuff: hgbook.red-bean.com/read/mercurial-in-daily-use.html
alemjerus

6
alemjerus: hg init+ hg pull= hg cloneความแตกต่างคือhg cloneสร้าง.hg/hgrcไฟล์ที่ดีสำหรับคุณและhg cloneจะใช้ฮาร์ดลิงก์เพื่อประหยัดพื้นที่เมื่อโคลนบนระบบไฟล์เดียวกัน
Martin Geisler

Richard: ผลลัพธ์ของhg help initอยู่ที่นี่: selenic.com/mercurial/hg.1.html#initแต่นั่นอาจจะสั้นเกินไป? โปรดส่งอีเมลไปที่รายชื่ออีเมลของเราหากคุณต้องการความช่วยเหลือเพิ่มเติม! ดู: mercurial.selenic.com/wiki/MailingLists
Martin Geisler

5

คุณอาจใช้

การแก้ไขแถบ hg

เพื่อฆ่าการแก้ไขใด ๆ และแผนผังย่อยในที่เก็บในเครื่องของคุณ

https://www.mercurial-scm.org/wiki/Strip

แต่อย่าพยายามใช้กับสิ่งที่ผลักดันไปแล้ว


คุณสามารถใช้กับการแก้ไขสาธารณะ แต่ถ้าคุณดึงอีกครั้งการแก้ไขจะปรากฏขึ้นอีกครั้ง (แถบ hg ใช้งานได้กับที่เก็บในเครื่องเท่านั้น)
Mike Rosoft

2

เพียงลบทุกสิ่งที่คุณมีในระบบภายในเครื่องของคุณและทำการโคลน repo ระยะไกลอีกครั้ง


2
hg strip `hg out --template" {rev} {author} \ n "| grep YOUR_AUTHOR_NAME | ตัด -d "" -f 1`

เคล็ดลับสำหรับฉัน

จะตัดการแก้ไขทั้งหมดที่ไม่ได้ถูกผลักไปยังที่เก็บเริ่มต้นซึ่งสร้างขึ้นด้วยชื่อผู้แต่งของคุณ

คุณยังสามารถใช้สไตล์นี้เพื่อทำให้ไม่ตรวจสอบกับที่เก็บเริ่มต้น แต่ใช้กับ Repository อื่น

hg strip `hg out OTHER_REPO_ALIAS - เทมเพลต" {rev} {author} \ n "| grep YOUR_AUTHOR_NAME | ตัด -d "" -f 1`

0

หากคุณกำลังใช้ TortoiseHg วิธีง่ายๆวิธีหนึ่งในการกำจัดความยุ่งเหยิง (เล็ก ๆ น้อย ๆ ) คือการอัปเดตการแก้ไขล่าสุดก่อนจากนั้นเลือกชุดการเปลี่ยนแปลงของคุณและเริ่ม "ผสานกับท้องถิ่น" เมื่อกล่องโต้ตอบการผสานปรากฏขึ้นให้คลิกไอคอน "+" เล็ก ๆ เพื่อแสดงตัวเลือกพิเศษบางอย่างซึ่งหนึ่งในนั้นคือ "ทิ้งชุดการเปลี่ยนแปลงจากการแก้ไขเป้าหมายการรวม (อื่น ๆ )" การทำเช่นนี้จะหมายความว่าชุดการเปลี่ยนแปลงของคุณจะยังคงอยู่ใน repo และได้รับการผลักดัน แต่จะไม่มีผลใด ๆ เนื่องจากจะถูกทิ้งในการผสาน หากคุณมีชุดการเปลี่ยนแปลงจำนวนมากที่ครอบคลุมหลายหัวคุณอาจไม่ต้องการสร้างมลพิษให้กับ repo ด้วยวิธีนี้ แต่เป็นการแก้ไขที่ง่ายและควรค่าแก่การพิจารณาว่าชุดการเปลี่ยนแปลงที่คุณจะทิ้งมีข้อมูลที่คุณอาจต้องการอ้างอิงในภายหลังหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.