SVN กระทำการเฉพาะไฟล์


219

มีวิธีใดที่จะคอมมิตรายการไฟล์เฉพาะ (เช่นหนึ่งในรายการไฟล์ที่ SVN ต้องการคอมมิต)

ฉันกำลังทำงานกับ MAC OS X ภายใต้ Terminal โดยไม่มี UI ใด ๆ

คำตอบ:


331

แน่ใจ เพียงแค่รายการไฟล์:

$ svn ci -m "Fixed all those horrible crashes" foo bar baz graphics/logo.png

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

$ svn ci -m "No longer sets printer on fire" printer-driver/*.c

คุณยังสามารถให้คำสั่ง svn อ่านรายการไฟล์ที่จะคอมมิทจากไฟล์:

$ svn ci -m "Now works" --targets fix4711.txt

1
ดังนั้นโดยทั่วไปฉันควรตั้งชื่อไฟล์อย่างชัดเจน? ฉันแค่บอกว่าอย่าแตะต้องไฟล์นี้โดยเฉพาะ?
0100110010101

16
คุณสามารถทำได้: svn st | cut -c 9-> เป้าหมาย.txtจากนั้นแก้ไขไฟล์ target.txt เพื่อลบไฟล์เฉพาะและใช้พารามิเตอร์ --targets เพื่อระบุตัวกรอง
rein

17
ฉันคิดว่าความท้าทายใหม่ของฉันคือการสร้างข้อบกพร่องซึ่งทำให้เครื่องพิมพ์ติดไฟ
James Webster

3
มันน่าสมเพชและไร้สาระเหมือนกัน ไม่มีพื้นที่จัดเตรียม svn addถูกใช้เพื่อเพิ่มไฟล์ลงในที่เก็บ
Kandinski

68

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

$ svn changelist fix-issue-237 foo.c 
Path 'foo.c' is now a member of changelist 'fix-issue-237'.

เสร็จแล้วตอนนี้ svn จะแยกสิ่งต่าง ๆ ให้คุณ สิ่งนี้จะช่วยเมื่อคุณเล่นกลการเปลี่ยนแปลงหลายอย่าง

$ svn status
A       bar.c
A       baz.c

--- Changelist 'fix-issue-237':
A       foo.c

สุดท้ายบอกให้ทำสิ่งที่คุณต้องการเปลี่ยนแปลง

$ svn commit --changelist fix-issue-237 -m "Issue 237"

+1 สำหรับคำตอบตรงจุด การเปลี่ยนแปลงเป็นวิธีที่จะไปจริงๆ!
Miro Markaravanes

1
หากคุณต้องการเพิ่มไดเรกทอรีใหม่ลงในรายการการเปลี่ยนแปลงอย่าลืมใช้ svn เพิ่มก่อนจากนั้นใช้svn changelist fix-issue-237 --recursive path/to/directory
Fabian Schmengler

อันที่จริงรายการเปลี่ยนแปลงไม่สามารถใช้กับไดเรกทอรีใหม่ได้ .... "การโค่นล้มไม่รองรับการใช้งานรายการเปลี่ยนแปลงกับไดเรกทอรี"
Fabian Schmengler

1
@fschmengler: SVN เป็นเครื่องมือที่น่ากลัว ฉันแค่พยายามทำให้ดีที่สุดเท่าที่จะทำได้ เปลี่ยนเป็นคอมไพล์ : P
jcwenger

10
ฉันเปลี่ยนมาใช้ Git เมื่อหลายปีก่อนและไม่เคยมองย้อนกลับไป ถูกบังคับให้ใช้ SVN อีกครั้งสำหรับลูกค้าที่มันรู้สึกเหมือนใช้กับลูกและห่วงโซ่ที่ขาทั้งสองข้าง
Fabian Schmengler

38

โดยทั่วไปคุณใส่ไฟล์ที่คุณต้องการคอมมิตในบรรทัดคำสั่ง

svn ci file1 file2 dir1/file3

1
ดังนั้นโดยทั่วไปฉันควรตั้งชื่อไฟล์อย่างชัดเจน? ฉันแค่บอกว่าอย่าแตะต้องไฟล์นี้โดยเฉพาะ?
0100110010101

2
หากทำงานโดยไม่มีอาร์กิวเมนต์ svn จะทำการส่งไฟล์ที่ถูกเปลี่ยนแปลงทั้งหมดหากรันด้วยไฟล์เป็นอาร์กิวเมนต์ไฟล์นี้จะถูกคอมมิตถ้าทำงานกับไดเรกทอรีไฟล์ที่เปลี่ยนแปลงทั้งหมดในไดเรกทอรีจะถูก
คอมมิต

22

เนื่องจากสถานะการโค่นล้มของฉันฉันต้องได้รับการสร้างสรรค์ svn stแสดงให้เห็นM, Aและ~สถานะ ฉันแค่ต้องการMและAดังนั้น ...

svn st | grep ^[A\|M] | cut -d' ' -f8- > targets.txt

คำสั่งนี้ระบุว่าค้นหาเอาต์พุตบรรทัดทั้งหมดโดยsvn stเริ่มต้นด้วยMหรือAตัดโดยใช้ตัวคั่นช่องว่างจากนั้นรับ colums 8 ถึงท้าย ดัมพ์นั้นลงใน target.txt และเขียนทับ

จากนั้นปรับแก้ target.txt เพื่อตัดรายชื่อไฟล์เพิ่มเติม จากนั้นเรียกใช้ด้านล่างเพื่อกระทำ:

svn ci -m "My commit message" --targets targets.txt

อาจไม่ใช่กรณีการใช้งานที่พบบ่อยที่สุด แต่หวังว่าจะช่วยได้บ้าง


2
คุณสามารถใช้grep -v '^~'บัญชีดำในสิ่งที่คุณต้องการ
Martin Konecny

10

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

คุณสามารถอ่านเกี่ยวกับพวกเขาในรูปแบบออนไลน์ของหนังสือ SVN ที่ดีเยี่ยม


7

ลองใช้สคริปต์นี้ ..

#!/bin/bash
NULL="_"
for f in `svn st|grep -v ^\?|sed s/.\ *//`; 
     do LIST="${LIST} $f $NULL on"; 
done
dialog --checklist "Select files to commit" 30 60 30 $LIST 2>/tmp/svnlist.txt
svn ci `cat /tmp/svnlist.txt|sed 's/"//g'`

1

ฉันสร้างโฟลเดอร์ (ย่อย) ชื่อ "ซ่อน" ย้ายไฟล์ที่ฉันไม่ต้องการให้มี จากนั้นให้คอมมิทโดยไม่สนใจคำร้องเรียนเกี่ยวกับไฟล์ที่หาย จากนั้นย้ายไฟล์ที่ซ่อนจากซ่อนกลับไปที่. /

ฉันรู้ว่าไม่มีข้อเสียสำหรับกลยุทธ์นี้

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