ยกเลิกทั้งหมดและรับสำเนาฉบับแก้ไขล่าสุดทั้งหมดหรือไม่


159

ฉันกำลังย้ายกระบวนการสร้างเพื่อใช้งาน Mercurial และต้องการให้ไดเรกทอรีทำงานกลับไปสู่สถานะของการแก้ไขเคล็ดลับ กระบวนการสร้างก่อนหน้านี้จะมีการแก้ไขไฟล์บางไฟล์และเพิ่มไฟล์บางไฟล์ที่ฉันไม่ต้องการยอมรับดังนั้นฉันจึงมีการเปลี่ยนแปลงและไฟล์ที่ไม่ได้เพิ่มลงในที่เก็บ

อะไรคือวิธีที่ง่ายที่สุดในการละทิ้งสิ่งเหล่านี้และรับไดเรกทอรีการทำงานที่สะอาดซึ่งมีการแก้ไขล่าสุด

ขณะนี้ฉันกำลังทำสิ่งนี้:

hg revert --all
<build command here to delete the contents of the working directory, except the .hg folder.>
hg pull
hg update -r MY_BRANCH

แต่ดูเหมือนว่าควรจะมีวิธีที่ง่ายกว่า

ฉันต้องการทำสิ่งที่เทียบเท่ากับการลบ repo ทำการโคลนนิ่งใหม่และการอัปเดต แต่ repo มีขนาดใหญ่เกินไปสำหรับที่จะเร็วพอ


1
"(ลบเนื้อหา ... )" เป็นความคิดเห็นต่อคำสั่ง "ย้อนกลับ - ทั้งหมด" หรือขั้นตอนที่คุณดำเนินการหรือไม่ ฉันถามเพราะ "อัปเดต hg" จะอัปเดตไฟล์ที่เปลี่ยนแปลงเท่านั้น หากคุณลบไฟล์อื่น ๆ ก่อนที่จะอัปเดตคุณจะไม่ได้รับสิ่งเหล่านั้นกลับมาเว้นแต่คุณจะอัปเดตกลับไปเป็นโมฆะแก้ไข ( hg update 00) จากนั้นสำรองข้อมูลไว้ที่ส่วนปลาย เหตุใดจึงไม่hg revert --allเพียงพอที่จะกลับสู่สถานะโฟลเดอร์การทำงานที่สอดคล้องกันก่อนที่จะดึงและอัปเดต
Lasse V. Karlsen

เป็นขั้นตอนแยกต่างหากกับซอฟต์แวร์สร้างของฉัน (ฉันจะได้ใช้เพียงบรรทัดคำสั่งลบ แต่ไม่ได้.)
Rory

1
คุณอาจพบว่าarchiveคำสั่งมีประโยชน์ในอนาคต ตัวอย่างเช่นคุณสามารถhg archive ../newbuildและภาพรวมของพื้นที่เก็บข้อมูลของคุณในที่สุดhg updateจะถูกวางไว้ที่นั่น ฉันมักจะทำเช่นนั้นสำหรับการสร้างทุกคืนเพื่อให้ฉันไม่เสี่ยงกับการซื้อคืน repo เพียงลบไดเรกทอรีสร้างเมื่อคุณไม่ต้องการมันอีกต่อไป
Tim Post

คำตอบ:


212

ขั้นตอนเหล่านั้นควรสั้นลงไปที่:

hg pull
hg update -r MY_BRANCH -C

-Cธงบอกคำสั่งปรับปรุงยกเลิกการเปลี่ยนแปลงในท้องถิ่นทั้งหมดก่อนที่จะปรับปรุง

อย่างไรก็ตามสิ่งนี้อาจยังคงไฟล์ที่ไม่ได้ติดตามในที่เก็บของคุณ ดูเหมือนว่าคุณต้องการกำจัดสิ่งเหล่านั้นด้วยดังนั้นฉันจะใช้purgeส่วนขยายสำหรับสิ่งนั้น:

hg pull
hg update -r MY_BRANCH -C
hg purge

ไม่ว่าในกรณีใดไม่มีคำสั่งเดียวที่คุณสามารถขอให้ Mercurial ทำสิ่งนั้นได้ทุกอย่างที่คุณต้องการที่นี่ยกเว้นถ้าคุณเปลี่ยนกระบวนการเป็นวิธี "โคลนเต็ม" ที่คุณบอกว่าคุณไม่สามารถทำได้


6
ขอบคุณมันเป็น 'การกำจัด' ที่ฉันต้องการ การอัพเดต -C ไม่ได้กำจัดไฟล์ที่ไม่ได้ติดตามซึ่งเป็นสิ่งสำคัญที่ฉันต้องดิ้นรน
โรรี่

4
คุณสามารถใช้ TortoiseHg เพื่อกำจัดได้เช่นกัน คุณเพียงแค่เปิดส่วนขยายในการตั้งค่าของ workbench (หรือแก้ไข mercurial.ini)
เดฟ

18
หากไม่ได้เปิดใช้งานส่วนขยายการล้างข้อมูลคุณสามารถใช้คำสั่งดังนี้: hg --config "extensions.purge=" purge --all
Samuel Delisle

5
@ csharptest.net hg purge --allเพียงแค่ให้ฉันปวดหัวที่ดีเพราะมันยังลบ configs ท้องถิ่นของฉันเช่น: ฐานข้อมูลผู้ใช้ / รหัสผ่าน ฯลฯ :)
VMC

@ SamuelDelisle ขอบคุณท่านมากฉันไม่ต้องการเปลี่ยนแปลงการตั้งค่าใด ๆ สำหรับคำสั่งเพียงครั้งเดียวในสคริปต์ของฉัน!
joonas.fi

113
hg up -C

การดำเนินการนี้จะลบการเปลี่ยนแปลงทั้งหมดและอัปเดตเป็นส่วนหัวล่าสุดในสาขาปัจจุบัน

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


นั่นรวมถึงไฟล์ที่ไม่ได้ติดตามหรือไม่? ฉันมีปัญหากับคำสั่งอื่นที่ฉันพยายาม ฉันจะให้มันลองตอนนี้ ...
Rory

7
@Rory: nope ใช้hg purgeสำหรับไฟล์ที่ไม่มีเวอร์ชัน
zerkms

10

ในการลบ untracked บน * ระวังโดยไม่ต้องล้างส่วนขยายที่คุณสามารถใช้

hg pull
hg update -r MY_BRANCH -C
hg status -un|xargs rm

ซึ่งกำลังใช้

update -r - rev REV REV

update -C - ทำความสะอาดทิ้งการเปลี่ยนแปลงที่ไม่ได้รับการยอมรับ (ไม่มีการสำรองข้อมูล)

status -u --unknown แสดงเฉพาะไฟล์ที่ไม่รู้จัก (ไม่ได้ติดตาม)

status -n - no-status ซ่อนคำนำหน้าสถานะ


4

หากคุณกำลังมองหาวิธีที่ง่ายคุณอาจต้องลองวิธีนี้

ฉันสำหรับตัวเองแทบจะไม่สามารถจดจำ commandline สำหรับเครื่องมือทั้งหมดของฉันได้


1. ก่อนอื่นเลือก "กระทำ"

ผูกมัด

2. จากนั้นแสดงไฟล์ที่ถูกละเว้น หากคุณมีการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดซ่อนไว้

แสดงไฟล์ที่ถูกละเว้น

3. ตอนนี้เลือกทั้งหมดแล้วคลิก "ลบการยกเลิกการสำรอง"

ลบทิ้ง

เสร็จสิ้น มันเป็นขั้นตอนที่ง่ายต่อการจดจำมากกว่า commandline stuff


ฉันไม่แน่ใจ (ฉันใช้ SourceTree ด้วยตัวเอง) แต่ภาพหน้าจอเหล่านี้มาจาก TortoiseHg Workbench โดยทั่วไปแล้วฉันคิดว่าโซลูชันที่ใช้ UI มีประโยชน์ แต่คำตอบนี้ต้องการการติดฉลากที่ดีกว่า นอกจากนี้ "ซ่อน" เสียงค่อนข้างคลุมเครือสำหรับฉัน
Jon Coombs

3

สถานะ hgจะแสดงไฟล์ใหม่ทั้งหมดแล้วคุณก็สามารถrmพวกเขา

โดยปกติฉันต้องการกำจัดไฟล์ที่ถูกละเว้นและไม่ผ่านดังนั้น:

hg status -iu                          # to show 
hg status -iun0 | xargs -r0 rm         # to destroy

จากนั้นทำตามด้วย:

hg update -C -r xxxxx

ซึ่งทำให้ไฟล์เวอร์ชันทั้งหมดอยู่ในสถานะที่ถูกต้องสำหรับการแก้ไข xxxx


เพื่อตามประเพณี Stack Overflow ในการบอกคุณว่าคุณไม่ต้องการทำสิ่งนี้ฉันมักจะพบว่า "ตัวเลือกนิวเคลียร์" นี้ได้ทำลายสิ่งที่ฉันสนใจ

วิธีที่ถูกต้องในการทำก็คือให้มีตัวเลือก 'ทำความสะอาด' ในกระบวนการสร้างของคุณและอาจเป็น 'สร้างความสะอาด' และ 'สร้างความสะอาด' ด้วย

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