นำการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดไว้ชั่วคราวไปใช้ในการโค่นล้ม (a la“ git-stash”)


312

ในขณะที่ซอฟต์แวร์การเขียนโปรแกรมเก็บไว้ใน repo Subversion ฉันมักจะแก้ไขไฟล์บางไฟล์แล้วสังเกตว่าฉันต้องการทำการเปลี่ยนแปลงขั้นเตรียมการสำหรับงานหลักของฉัน เช่นในขณะที่ใช้งานฟังก์ชั่นใหม่ฉันสังเกตเห็นการเปลี่ยนโครงสร้างใหม่ซึ่งอาจช่วย

เพื่อไม่ให้ผสมผสานการเปลี่ยนแปลงที่ไม่เกี่ยวข้องสองรายการในกรณีนี้ฉันต้องการ "เก็บ" การเปลี่ยนแปลงของฉันเช่นเปลี่ยนกลับเป็นเวอร์ชันที่เก็บทำการเปลี่ยนแปลงอื่น ๆ ยอมรับการเปลี่ยนแปลงเหล่านี้จากนั้น "ดึงการเปลี่ยนแปลง" กลับคืน

git-stashอนุญาตให้ทำเช่นนั้นได้ มีวิธีการทำเช่นนี้กับการโค่นล้มทั้งโดยตรงหรือกับปลั๊กอินหรือสคริปต์บางอย่าง ปลั๊กอิน Eclipse ก็น่าจะดีเช่นกัน


6
แค่อยากรู้อยากเห็น แต่ทำไมไม่ใช้ git-svn
cmcginty

3
ข่าวที่เกี่ยวข้องบางอย่าง: infoworld.com/d/application-development/ … (อ้างถึง: "เขายังตั้งข้อสังเกตอีกว่าการวางจำหน่าย Subversion 1.8 ที่กำลังจะมาถึงควรนำมาใกล้กับความสามารถของ Git ด้วยคุณสมบัติเช่น Git Stash ซึ่งนักพัฒนาสามารถทำการเปลี่ยนแปลงในท้องถิ่นได้ จากนั้นตั้งค่าไว้และออฟไลน์คอมมิตซึ่งบันทึกการเปลี่ยนแปลงเสร็จสมบูรณ์เมื่อนักพัฒนาออฟไลน์และย้ายไปยังที่เก็บข้อมูลหลักเมื่อนักพัฒนาเชื่อมต่อใหม่ "
Sebastiaan van den Broek

1
อัปเดต (ณ วันที่ 2012-04-26): ขณะนี้มีการกำหนดชั้นวางของสำหรับ 1.9 โดยไม่มี ETA ใด ๆ ดังนั้นจึงอาจใช้เวลาสักครู่ ...
sleske

10
อัปเดต (จนถึงวันที่ 2012-11-17): ตอนนี้มีการจัดชั้นวางสำหรับ 1.10 บางทีมันอาจจะถูกกำหนดไว้สำหรับ <รุ่นถัดไป +1> หรือไม่ ;-)
sleske

3
อัปเดต (ณ วันที่ 2015-03-23, 2 ปีครึ่งต่อมา): ข่าวดีก็คือว่า Shelving ยังคงกำหนดไว้สำหรับ 1.10 ข่าวร้ายคือ ETA: Q2 2015 (ไม่แน่นอน) ปล่อย 1.9.0 / 2017? (เก็งกำไรที่ดีที่สุด) ปล่อย 1.10.0 ( subversion.apache.org/roadmap.html )
ribamar

คำตอบ:


69

เมื่อฉันได้รับการเปลี่ยนแปลงอย่างไม่มีข้อผูกมัดจากงานหนึ่งในสำเนางานของฉันและฉันต้องการเปลี่ยนไปใช้งานอื่นฉันจะทำหนึ่งในสองสิ่งต่อไปนี้:

  1. ตรวจสอบสำเนาการทำงานใหม่สำหรับงานที่สอง

    หรือ

  2. เริ่มสาขา:

    workingcopy$ svn copy CURRENT_URL_OF_WORKING_COPY SOME_BRANCH
    workingcopy$ svn switch SOME_BRANCH
    workingcopy$ svn commit -m "work in progress"
    workingcoyp$ svn switch WHATEVER_I_WAS_WORKING_ON_BEFORE
    

ฉันมีสคริปต์บางอย่างที่ช่วยในการทำสิ่งนี้โดยอัตโนมัติ


65
นี้จะมีผลในถังขยะจำนวนมากในการโค่นล้มของเซิร์ฟเวอร์
knittl

3
@knittl: ไม่มันจะไม่เกิดขึ้น และสิ่งที่สำคัญยิ่งกว่า: จะไม่ส่งผลให้เกิดการเปลี่ยนแปลงที่หายไปเช่นเดียวกับข้อเสนอแนะของคุณ นี่และการตรวจสอบสำเนาของลำต้น / สาขาอื่นอีกครั้งเป็นเพียงสองวิธีที่เชื่อถือได้ในการทำสิ่งนี้ที่ฉันรู้ หากคุณรู้สึกไม่สบายใจกับสิ่งนี้เพียงแค่ตรวจสอบสำเนาอื่นและทำงานในแบบคู่ขนาน
sbi

2
@knittl: สาขาสามารถสร้างในเส้นทางที่ไม่เด่นซึ่งอยู่นอกสาขาหรือตำแหน่งแท็กเริ่มต้นของโครงการ ตัวอย่างเช่นทีมสามารถกำหนดproject\temp\<creationdate-reason>หรือproject\personal\<creationdate-reason>เพื่อจุดประสงค์นี้

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

8
นี่ไม่เป็นประโยชน์กับที่เก็บขนาดใหญ่ นี่ไม่ใช่ตัวเลือกอย่างแน่นอนในสภาพแวดล้อมการทำงานของฉัน และในขณะที่ฉันต้องการให้พื้นที่เก็บข้อมูลของเรามีขนาดเล็กลงและจัดระเบียบได้ดีขึ้นและค่อนข้างตรงไปตรงมาเป็นพื้นที่เก็บข้อมูล git แทนที่จะเป็น svn ฉันถูก จำกัด ขอบเขตของวิธีการจัดระเบียบรหัสของเราในองค์กรของเรา
AdrianVeidt

337

โพสต์บล็อกนี้แนะนำให้ใช้ diff และ patch

  • git stash ประมาณกลายเป็น svn diff > patch_name.patch; svn revert -R .
  • git stash apply กลายเป็น patch -p0 < patch_name.patch

โปรดทราบว่านี่ไม่ใช่การเปลี่ยนแปลงข้อมูลเมตาหรือการสร้าง / ลบไดเรกทอรี (ฉันคิดว่า) (ใช่ svn ติดตามสิ่งเหล่านั้นแยกจากเนื้อหาไดเรกทอรีซึ่งแตกต่างจาก git)


13
นี่คือการทำซ้ำโดยไม่ตั้งใจของstackoverflow.com/questions/1554278/… - ส่ง upvotes ที่นั่น
วอลเตอร์ Mundt

2
ดูเหมือนจะไม่รวมไฟล์ไบนารีซึ่งน่ารำคาญ อย่างน้อยเมื่อใช้ TortoiseSVN เพื่อสร้างแพตช์
angularsen


6
คุณสามารถติดตามข้อมูลเมตาได้มากกว่าหรือน้อยกว่าหากคุณใช้svn patch patch_name.patchแทนที่จะเป็นpatch -p0เพราะพวกเขาอยู่ในไฟล์แพทช์และโปรแกรมแก้ไข svn เข้าใจพวกเขา
mat

สิ่งนี้ไม่รวมถึงการเปลี่ยนแปลงของผู้ที่อยู่ภายนอก
congusbongus

182

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

svn diff > stash.patch
svn revert -R .

หลังจากที่คุณใช้คุณลักษณะการเตรียมการของคุณแล้วคุณสามารถใช้โปรแกรมปรับปรุงกับยูทิลิตี้โปรแกรมแก้ไขได้:

patch < stash.patch

ดังที่คนอื่น ๆ ระบุไว้ว่าสิ่งนี้จะไม่ทำงานกับsvn:propertiesและการดำเนินการทรี (เพิ่มลบเปลี่ยนชื่อไฟล์และไดเรกทอรี)

ไฟล์ไบนารีอาจมีปัญหาฉันไม่รู้ว่าแพทช์ (หรือ TortoiseSVN ในกรณีนี้จัดการได้อย่างไร)


4
ฉันคิดว่ามันอาจจะทำงานได้ไม่ดีกับไฟล์ที่ถูกลบ / เปลี่ยนชื่อ
JesperE

7
ดูกล่องหัวข้อ "ทำไมไม่ใช้ Patch แทน" ที่svnbook.red-bean.com/en/1.5/…เพื่อทำความเข้าใจว่าเหตุใดจึงเป็นความคิดที่ไม่ดี
sbi

4
@sbi: ฉันไม่คิดว่ามันเป็นเหตุผลที่ถูกต้องสำหรับ downvote มันไม่ใช่ "คำตอบที่ไม่ดี" มันไม่ใช่คำตอบที่สมบูรณ์แบบนั่นคือทั้งหมด ฉันไม่คิดว่าบุคคลนี้สมควรได้รับการลงโทษสำหรับคำแนะนำของเขา คุณต้องการให้เขาไม่ตอบแทนไหม? ถ้าใช่แล้วใช่คุณควรจะลงคะแนน มิฉะนั้นนี่เป็นการลงโทษความตั้งใจที่ดี
Sedat Kapanoglu

5
ในกรณีที่คนอื่นอย่างฉันคิดว่านี่ดูเหมือนโซลูชันน้ำหนักเบาและตัดสินใจลองฉันต้องใช้ patch -p0 <stash.patch - ไม่อย่างนั้นมันบ่นว่าไม่สามารถหาไฟล์ที่จะแก้ไขได้
CupawnTae

4
คำแนะนำนี้จะช่วยโดยเฉพาะอย่างยิ่งถ้าคุณมาจากพื้นหลังคอมไพล์และถูกบังคับให้ใช้ SVN เนื่องจากเหตุผลหลายประการ การปรับปรุงเล็กน้อยในคำแนะนำที่ได้รับสำหรับผู้ใช้งานแพตช์ครั้งแรก: $ patch --strip=0 < stash.patch นี่จะช่วยให้แน่ใจได้ว่าแพทช์ไม่ถามชื่อไฟล์เมื่อคุณใช้แพตช์ของคุณ
ksinkar

43

วิธีที่ง่ายที่สุดคือการใช้สาขาชั่วคราวเช่นนี้

$ svn copy ^/trunk ^/branches/tempbranch
$ svn switch ^/branches/tempbranch
$ svn commit -m "Stashed"
$ svn switch ^/trunk
$ ... hack away in trunk ...
$ svn commit -m "..."
$ svn merge ^/branches/tempbranch .
$ svn rm ^/branches/tempbranch
$ ... continue hacking

สิ่งนี้สามารถวาง (และอาจจะ) ในสคริปต์ถ้าทำอย่างสม่ำเสมอมากขึ้น


2
เหตุใดจึงถูกโหวตในขณะที่ "โซลูชัน" ได้รับการลงคะแนนซึ่งไม่สามารถใช้งานได้เมื่อคุณลบ / เพิ่มไฟล์หรือเปลี่ยนแปลงคุณสมบัติใด ๆ ใช่นี่ไม่ใช่สิ่งที่ง่ายที่สุดที่จะทำเมื่อคุณทำมันเป็นครั้งแรก แต่นอกเหนือจากการมีสำเนาอื่นตรวจสอบการทำงานแบบขนานนี่เป็นทางออกเดียวที่ทำงานได้ในทุกกรณี
sbi

5
ใช้ไวยากรณ์ ^ สำหรับ repo root ได้ดีตั้งแต่ตั้งแต่ svn 1.6 ทางออกที่ดีเมื่อ repo ของคุณมีแท็ก / แท็ก / กิ่งที่ระดับบนสุด
Bendin

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

3
@sleske: ใช่คุณกำลังยืนยันที่เก็บชั่วคราวของคุณไปยังเซิร์ฟเวอร์ แต่สาขาตัวเองจะถูกลบ อย่างไรก็ตามฉันคิดว่านี่เป็นวิธีที่เร็วและแข็งแกร่งที่สุดที่จะทำ
JesperE

5
@sleske: SVN ไม่ใช่ VCS แบบกระจายดังนั้นทุกอย่างต้องอยู่บนเซิร์ฟเวอร์ นั่นเป็นวิธีที่มันเป็น
sbi

24

ในฐานะของ 1.10.0 (2018/04/13) คุณต้องทดลองคำสั่งsvn shelve ( TortoiseSVN สนับสนุนคำสั่ง ) มันไม่มีอะไรนอกจากผู้ช่วยในการบันทึกแพตช์และนำกลับมาใช้ดังนั้นจึงมีข้อ จำกัด เช่นเดียวกับsvn diff+ patch(นั่นคือไม่สามารถจัดการกับไฟล์ไบนารีและเปลี่ยนชื่อ) ( แก้ไข : ดูเหมือนว่าการสนับสนุนแบบไบนารีจะมาในรุ่นถัดไป 1.11.0 )

แก้ไข ^ 2: ด้วย 1.11.0 (ปล่อยตัว 2018/10/30) ไฟล์ไบนารีจะได้รับการสนับสนุน การเก็บไฟล์ที่ถูกเปลี่ยนชื่อยังไม่ได้รับการสนับสนุน การเก็บเข้าลิ้นชักใน 1.11 เข้ากันไม่ได้กับชั้นวางที่สร้างขึ้นโดย 1.10

แก้ไข ^ 3:ด้วย 1.12.0 (ปล่อยตัว 2019/04/24), การคัดลอกและการเปลี่ยนชื่อจะได้รับการสนับสนุน การเก็บเข้าลิ้นชักใน 1.12 เข้ากันไม่ได้กับชั้นวางที่สร้างขึ้นโดยรุ่นก่อนหน้า

แก้ไข ^ 4:มีการเปลี่ยนแปลงรอบเก็บเข้าลิ้นชักที่ไม่มีคือ1.13.0และ1.14.0 คำสั่งยังคงถูกทำเครื่องหมายว่าเป็นการทดลองและคุณจำเป็นต้องกำหนดSVN_EXPERIMENTAL_COMMANDS=shelf3เพื่อเปิดใช้งานคุณลักษณะนี้ ดูเหมือนว่ามีคุณลักษณะในปัจจุบัน untriaged

บันทึกการออกแบบสามารถพบได้ที่นักพัฒนาวิกิพีเดีย

$ svn x-shelve --help
x-shelve: Move local changes onto a shelf.
usage: x-shelve [--keep-local] SHELF [PATH...]

  Save the local changes in the given PATHs to a new or existing SHELF.
  Revert those changes from the WC unless '--keep-local' is given.
  The shelf's log message can be set with -m, -F, etc.

  'svn shelve --keep-local' is the same as 'svn shelf-save'.

  The kinds of change you can shelve are committable changes to files and
  properties, except the following kinds which are not yet supported:
     * copies and moves
     * mkdir and rmdir
  Uncommittable states such as conflicts, unversioned and missing cannot
  be shelved.

  To bring back shelved changes, use 'svn unshelve SHELF'.

  Shelves are currently stored under <WC>/.svn/experimental/shelves/ .
  (In Subversion 1.10, shelves were stored under <WC>/.svn/shelves/ as
  patch files. To recover a shelf created by 1.10, either use a 1.10
  client to find and unshelve it, or find the patch file and use any
  1.10 or later 'svn patch' to apply it.)

  The shelving feature is EXPERIMENTAL. This command is likely to change
  in the next release, and there is no promise of backward compatibility.

Valid options:
  -q [--quiet]             : print nothing, or only summary information
  --dry-run                : try operation but make no changes
  --keep-local             : keep path in working copy

(...)

$ svn x-unshelve --help
x-unshelve: Copy shelved changes back into the WC.
usage: x-unshelve [--drop] [SHELF [VERSION]]

  Apply the changes stored in SHELF to the working copy.
  SHELF defaults to the newest shelf.

  Apply the newest version of the shelf, by default. If VERSION is
  specified, apply that version and discard all versions newer than that.
  In any case, retain the unshelved version and versions older than that
  (unless --drop is specified).

  With --drop, delete the entire shelf (like 'svn shelf-drop') after
  successfully unshelving with no conflicts.

  The working files involved should be in a clean, unmodified state
  before using this command. To roll back to an older version of the
  shelf, first ensure any current working changes are removed, such as
  by shelving or reverting them, and then unshelve the desired version.

  Unshelve normally refuses to apply any changes if any path involved is
  already modified (or has any other abnormal status) in the WC. With
  --force, it does not check and may error out and/or produce partial or
  unexpected results.

  The shelving feature is EXPERIMENTAL. This command is likely to change
  in the next release, and there is no promise of backward compatibility.

Valid options:
  --drop                   : drop shelf after successful unshelve
(...)

$ svn help | grep x-
 x-shelf-diff
 x-shelf-drop
 x-shelf-list (x-shelves)
 x-shelf-list-by-paths
 x-shelf-log
 x-shelf-save
 x-shelve
 x-unshelve

9

ฉันไม่รู้วิธีง่ายๆในการทำเช่นนั้นกับ svn สุจริตฉันแนะนำให้ใช้git-svnเพื่อสร้าง repo คอมไพล์ที่ทำหน้าที่เป็นสำเนาการทำงาน svn และเพียงแค่ใช้git stashกับที่ เพียงแทนที่git pullด้วยgit svn rebaseและgit pushด้วยgit svn dcommitและคุณสามารถเก็บเวิร์กโฟลว์ git ได้ 90% และยังคงคุยกับเซิร์ฟเวอร์ svn


แต่การเชื่อมโยงstackoverflow.com/questions/1554278/ …ฉันพูดถึงในความคิดเห็นข้างต้นไม่ได้เสนอวิธีการแก้ปัญหาในทางปฏิบัติเพื่อสะสมใน svn เท่านั้น
VonC

ยุติธรรมเพียงพอ อันที่จริงแล้ว google นำฉันไปสู่โซลูชันนั้นในบล็อกในตอนนี้ ฉันยังคงยืนยันว่าสำหรับผู้ถามนี้ git-svn เป็นวิธีแก้ปัญหาตามธรรมชาติ
Walter Mundt

ฉันสงสัยว่าโซลูชันจะตามหลังการเปลี่ยนชื่อไฟล์เนื่องจากคอมไพล์ไม่ได้
NO_NAME

4

มีขนาดเล็กงูหลาม 2 สคริปต์เรียกว่าเป็นsvn-stash: ใช้ได้ภายใต้ GPL 3 https://github.com/frankcortes/svn-stash

มันทำงานเหมือนกับsvn diff/patchโซลูชันที่กล่าวถึงและเสนอการผลักดันและ popping ของการเปลี่ยนแปลงที่แตกต่างในไดเรกทอรีท้องถิ่นบาง น่าเสียดายที่ไม่สามารถตั้งชื่อ stashes ได้และมีเพียงอันสุดท้ายเท่านั้นที่สามารถโผล่ออกมาได้ (เช่นกันใช่มันเป็นสแต็ก แต่ไม่มีเหตุผลที่จริงสำหรับข้อ จำกัด ดังกล่าว) แต่จากนั้นคุณสามารถสร้างคุณลักษณะที่หายไปใน แหล่ง

มันถูกเขียนขึ้นสำหรับ * ix แต่หลังจากแทนที่ทุก "/" ด้วยos.sepมันทำงานได้ดีใน Windows เช่นกัน

หากคุณใช้ svn 1.7 หรือสูงกว่าคุณจะต้องเปลี่ยนis_a_current_stash(): ลบบรรทัดif ".svn" in os.listdir(CURRENT_DIR):ออกเนื่องจากมี subir ระดับ. svn เพียงหนึ่งระดับบนสุดใน 1.7 WC's


มันไม่ได้สำหรับฉันในหน้าต่าง! :(
Antonio Petricca

4

คุณสามารถทำได้อย่างง่ายดายโดยใช้ Intellij IDEA - Shelve Changes


วิธีนี้สามารถจัดการmetadata changesและdirectory creates/deletes? เช่นเดียวกับสิ่งgit stashที่ไม่?
wonsuc

3

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

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


หมายเหตุ: นั่นเป็นหลักเหมือนกับการตรวจสอบสำเนาทำงานสอง - เท่านั้นโดยไม่ต้องชำระเงิน :-)
sleske

6
@sleske: ใช่โดยไม่ต้องจำนวนมากของแบนด์วิดธ์ที่จำเป็นสำหรับการเช็คเอาท์ใหม่
knittl

ชอบหรือไม่นี่คือคำตอบที่สะท้อนพฤติกรรม "git stash" มากขึ้น การสร้างสาขานั้นยอดเยี่ยม แต่เกี่ยวข้องกับการเก็บเข้าลิ้นชัก TFS มากกว่า
Charles Roberto Canato

1

ฉันยังต้องการคุณลักษณะนี้ ฉันใช้ TortoiseSVN

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

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


1

ฉันเช็คเอาต์ที่สองเสมอซึ่งฉันเรียกว่า "trunk_clean" เมื่อใดก็ตามที่ฉันต้องทำการเปลี่ยนแปลงอย่างรวดเร็วโดดเดี่ยวที่เกี่ยวข้องกับสิ่งที่ฉันทำฉันเพียงแค่ยืนยันการชำระเงินนั้นแทน


0

แนวคิดการแตกแขนงและการปะแก้ข้างต้นนั้นยอดเยี่ยมมาก แต่มันไม่ได้ผลสำหรับฉัน ฉันใช้เครื่องมือดิฟแบบดิฟเฟอเรนต์ดังนั้นการรันgit diffจึงไม่สร้างแพตช์ที่เป็นข้อความ ระบบการสร้างของเราหมุนขึ้นสภาพแวดล้อมใหม่ทุกครั้งที่มีการสร้างสาขาดังนั้นการสร้างสาขา "ที่ซ่อน" ชั่วคราวจะทำให้ยุ่งเหยิง

แต่ฉันเขียนเชลล์สคริปต์เล็กน้อยที่คัดลอกไฟล์ไปยังไดเรกทอรี "ชั้นวาง" เพิ่มการประทับเวลาและย้อนกลับการเปลี่ยนแปลง มันไม่ได้แข็งแกร่งพอ ๆ กับวิธีการแก้ปัญหาข้างต้น แต่ก็หลีกเลี่ยงข้อผิดพลาดบางอย่างที่ฉันพบ


0

จากคำตอบของวอลเตอร์ฉันได้สร้างนามแฝงต่อไปนี้ในไฟล์ bashrc ของฉัน:

alias svn.stash='read -p "saving local changes in raq.patch. Existing stash in raq.patch will be overwritten. Continue?[y/N]" && [[ $REPLY =~ ^[yY] ]] && rm -f raq.patch && svn diff > raq.patch && svn revert -R .'
alias svn.stash.apply='patch -p0 < raq.patch; rm -f raq.patch'

นามแฝงเหล่านี้ง่ายต่อการใช้และจดจำ

การใช้งาน:

svn.stashเพื่อสะสมการเปลี่ยนแปลงและsvn.stash.applyเพื่อนำไปใช้สะสม


0

ในทางปฏิบัติของฉันฉันใช้git initเพื่อสร้างพื้นที่เก็บข้อมูล Git ในtrunkไดเรกทอรีของพื้นที่เก็บข้อมูลการโค่นล้มของฉันและจากนั้นฉันเพิ่มลง*.gitในรูปแบบการดูดละเว้น

หลังจากแก้ไขไฟล์บางไฟล์แล้วหากฉันต้องการใช้งาน Subversion mainline ต่อไปฉันจะใช้git stashเพื่อซ่อนงานของฉัน หลังจากคอมมิชชันไปยังแหล่งเก็บข้อมูลการโค่นล้มฉันใช้git stash popเพื่อคืนค่าการแก้ไขของฉัน


2
นี่เป็นทางออกที่ดีจริงๆ! โซลูชันอื่น ๆ อีกมากมายใช้เครื่องมือของบุคคลที่สามในการแก้ปัญหา อันนี้ใช้ Git เป็นเครื่องมือของบุคคลที่สาม มีข้อดีหลายประการ: 1) Git นั้นกว้างและมีประสิทธิภาพ 2) หลายคนติดตั้ง Git เรียบร้อยแล้ว
Lii

ฉันอยากรู้ว่ามันทำงานอย่างไรถ้าคุณไม่ทำคอมไพล์ด้วย
B2K

0

ใช้:

svn cp --parents . ^/trash-stash/my-stash

มันจะสร้างสาขาจากที่ตั้งปัจจุบันและการแก้ไขในปัจจุบันและจากนั้นจะส่งการเปลี่ยนแปลงในสำเนาการทำงานไปยังสาขานั้นโดยไม่เปลี่ยนไปใช้

การใช้งาน: คัดลอก SRC [@REV] ... DST

SRC และ DST สามารถเป็นเส้นทางการคัดลอก (WC) หรือ URL ที่ใช้งานได้:

WC  -> URL:  immediately commit a copy of WC to URL

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

หากต้องการคืนค่าการเปลี่ยนแปลงคุณสามารถรวมการเปลี่ยนแปลงจากสาขาที่สร้างขึ้นใหม่เข้ากับสำเนาการทำงานของคุณ

svn merge --ignore-ancestry ^/trash-stash/my-stash -c <commited revision>

--ignore-ancestry ใช้เพื่อไม่ให้ปรับปรุงข้อมูลผสานในสำเนาการทำงาน

ใช้:

svn ls -v ^/trash-stash/

เพื่อดูสิ่งที่คุณมีในเส้นทางที่ซ่อน มีการพิมพ์การแก้ไขที่กำหนดไว้

หากคุณไม่ต้องการการซ่อนอีกต่อไปเพียงแค่เรียกใช้:

svn rm ^/trash-stash/my-stash

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


-1

เนื่องจากการโค่นล้มไม่รองรับstashคุณสมบัติอย่างสมบูรณ์แบบ
ฉันจึงทำแบบแมนนวลเช่นนี้

สถานที่DevelopmentและProduction(release)โครงการไปยังเส้นทางที่แยกจากกัน

source\code\MyApp         -- Development
release\MyApp(release)    -- Production(release)

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

เมื่อคุณต้องปล่อยมันเพื่อการผลิตให้เปิดโปรเจ็กต์การผลิตอัปเดต svn และทำสิ่งต่าง ๆ เพื่อปล่อย (สร้างส่งออก ... ฯลฯ )

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

ฉันใช้ svn สำหรับโครงการเฉพาะเนื่องจากสมาชิกในทีมใช้มันดังนั้นฉันต้องทำตาม
ทางออกที่ดีที่สุดคือการใช้งานที่มีระบบการควบคุมเวอร์ชันสมบูรณ์แบบและดีกว่าgitsvn


ยังไม่ชัดเจนว่าคุณกำลังทำอะไร (เวอร์ชันใดที่ได้รับการตรวจสอบในไดเรกทอรีที่คุณพูดถึง) แต่ดูเหมือนว่าจะซ้ำคำตอบที่ได้รับคะแนนสูงสุด ("ลองดูสำเนาที่ใช้งานได้ใหม่")
sleske

@sleske ขออภัยฉันไม่ได้อ่านรายละเอียดเคสของคุณ ในกรณีของฉันฉันต้องการdevและเพียงprod2 สถานการณ์ ในการพัฒนาฟังก์ชั่นใหม่อย่างสมบูรณ์จะมีความซับซ้อนกับ svn ฉันไม่แน่ใจว่ามีวิธีการที่ชัดเจนในการแก้ปัญหาของคุณใน svn world หรือไม่
wonsuc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.