SVN: ละเว้นไดเรกทอรีบางรายการแบบเรียกซ้ำ


106

ฉันไม่ต้องการให้ไดเร็กทอรีใด ๆ ตั้งชื่อbuildหรือdistเข้าไปใน SVN ของฉันไม่ว่ามันจะอยู่ลึกแค่ไหนในต้นไม้ก็ตาม

เป็นไปได้หรือไม่ ในคอมไพล์ฉันใส่

build
dist

ใน.gitignoreรากของฉันและมันจะละเว้นซ้ำ ฉันจะทำสิ่งนี้กับ svn ได้อย่างไร? โปรดอย่าบอกให้ฉันทำอุปกรณ์ประกอบฉากกับพ่อแม่ทุกคน ...


ตรวจสอบคำตอบนี้สำหรับโซลูชันดั้งเดิมหากคุณใช้ Subversion 1.8
Frank Kusters

คำตอบ:


57

เนื่องจากการโค่นล้ม 1.8 ตอนนี้มีsvn:global-ignoresคุณสมบัติที่ทำงานเหมือนsvn:ignoreแต่เรียกซ้ำ (ดังนั้นตั้งค่านี้ในไดเรกทอรีระดับบนสุดของคุณ)


3
ฉันสับสนเล็กน้อย - มีglobal-ignoresอยู่ใน~/.subversion/configไฟล์ แต่ยังรวมถึงคุณสมบัติที่สืบทอดได้ที่ svn:global-ignoresตั้งอยู่บนไดเร็กทอรีใน SVN repo ด้วยเช่นกันsvn:ignoreคุณสามารถให้ข้อมูลสรุปของตัวเลือกต่างๆเหล่านี้และเปรียบเทียบได้อย่างไร อย่างไร--recursiveธงส่งผลกระทบต่อพวกเขามากเกินไป?
ได๋

2
ฉันได้ทำการวิจัยของตัวเองและเผยแพร่ผลการวิจัยของฉันในคำตอบ QA นี้: stackoverflow.com/a/86052/159145
ได

[ฉันลองแล้วแต่ล้มเหลวobjโฟลเดอร์ยังคงปรากฏอยู่] ( stackoverflow.com/questions/50960188/… ) คุณช่วยฉันดูได้ไหม
ลุค

ฉันสามารถพูดว่า "build / *" ไปละเว้นทุกอย่างด้านล่าง build ภายในทุกโฟลเดอร์ build ได้ไหม
Johannes Schaub -

45

svn propsetใช้เวลา--recursiveเป็นตัวเลือกเพื่อให้คุณสามารถทำเช่นนี้กับสองข้อเสีย:

  1. คุณต้องตรวจสอบที่เก็บทั้งหมด (หรืออย่างน้อยก็ไดเร็กทอรีทั้งหมดในนั้น) และ
  2. คุณต้องจำไว้ว่าต้องตั้งค่าsvn:ignoreคุณสมบัติเมื่อใดก็ตามที่คุณเพิ่มไดเร็กทอรีใหม่

42

มันเป็นไปไม่ได้ที่จะทำเช่นนี้ กลไกการละเว้นมีเพียงสองกลไกในการโค่นล้มsvn:ignore(ซึ่งไม่เกิดขึ้นซ้ำ) และglobal-ignores(ซึ่งไม่เฉพาะเจาะจงกับที่เก็บ)


7
svn propset --recursive svn: ละเว้น svn_ignore_rules โดยที่ svn_ignore_rules เป็นไฟล์ที่มีกฎการละเว้น - หนึ่งรายการต่อบรรทัด
georg

3
'svn propset --recursive svn: ละเว้น - ไฟล์ svn_ignore_rules' สำหรับฉันด้วย svn-1.7.6 มิฉะนั้นคุณจะละเว้นไฟล์ชื่อ 'svn_ignore_rules' ซ้ำ ๆ [แก้ไข: ตาม 'wytten' ในความคิดเห็นด้านล่าง]
elbeardmorez

9
ถึงผู้แสดงความคิดเห็น: ดังที่ผู้ถามกล่าวว่า "โปรดอย่าบอกให้ฉันทำอุปกรณ์ประกอบฉากกับพ่อแม่ทุกคน ... "
Kevin Reid

5
ตอนนี้เป็นไปได้ใน Subversion 1.8
Squirrel

17

สิ่งนี้ใช้ได้กับฉัน:

 svn propset --recursive svn:ignore *.zip <dir_tree_with_no_zips>

2
ขอบคุณสำหรับสิ่งนี้ใช้งานได้ดี ... โดยวิธีเดียวที่ฉันพบว่าละเว้นทั้ง * .txt และ * .pdf คือใส่รูปแบบเหล่านั้นในไฟล์จากนั้นใช้ตัวเลือก 'svn propset --file'
wytten

14

เพิ่มในไฟล์ ~ / .subversion / config หรือ / etc / subversion / config ของคุณ:

[miscellany]
global-ignores = build dist

ฉันอยากจะทำต่อ repo ถ้าทำได้
Paul Tarjan

1
อืมไม่แน่ใจว่ามีวิธีง่ายๆในการทำต่อ repo หรือไม่ pre-commit hook สามารถปฏิเสธรูปแบบบางอย่างได้ แต่ไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์ svn: ละเว้นการทำงานของผู้ปกครองแต่ละคน แต่ไม่สามารถเรียกซ้ำได้ คุณสามารถสลับไฟล์ config ของคุณด้วยสคริปต์เมื่อทำงานกับ repos ที่แตกต่างกัน แต่นั่นเป็นขั้นตอนพิเศษ
jspcal

1
สิ่งที่ไม่สร้างอหมายถึง?
IgorGanapolsky

9

เป็นไปได้ที่จะละเว้น build และ dist dirs โดยการลบไดเร็กทอรีออกจากการควบคุมเวอร์ชัน เคล็ดลับคือใช้ตัวเลือก --keep-local เพื่อออกจากไดเร็กทอรีในสำเนาที่ใช้งานได้ ตัวอย่างเช่น:

svn rm dist --keep-local
svn ci -m'removed build directory from version control'

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

ไชโยโจ


7

ตัวอย่างเช่นโครงสร้างโฟลเดอร์:

Project/
Project/dist/

cd Project
svn propset svn:ignore '*' dist/
svn ci -m "content of dist ignored"

เป็นการดีที่จะทำการลบเนื้อหา dist ก่อนคำสั่งละเว้นดังนั้นสำหรับสาขา dist จะว่างเปล่า

ทำงานให้ฉันทดสอบวันนี้ นี่คือหน้าอธิบายเล็กน้อย


6

ในการละเว้นไฟล์ดังกล่าวทั้งหมดในที่เก็บทั้งหมดคุณสามารถเพิ่ม a global-ignoresในไฟล์คอนฟิกูเรชันต่อผู้ใช้ของคุณ

บนระบบที่เหมือน Unix พื้นที่นี้จะปรากฏเป็นไดเร็กทอรีชื่อ. subversion ในโฮมไดเร็กทอรีของผู้ใช้ ในระบบ Win32 Subversion จะสร้างโฟลเดอร์ชื่อ Subversion โดยปกติจะอยู่ภายในพื้นที่ Application Data ของไดเร็กทอรีโปรไฟล์ของผู้ใช้

ดูตัวเลือกการกำหนดค่า

น่าเสียดายที่ไม่มีตัวเลือกต่อที่เก็บสำหรับทำสิ่งนี้ โดยพื้นฐานแล้วเป็นแบบต่อผู้ใช้หรือต่อไดเรกทอรีดังนั้นหลาย ๆ ตัวsvn:ignoresจึงน่าจะเป็นวิธีที่น่ารำคาญเท่าที่จะเป็นไปได้


1
ฉันอยากจะทำต่อ repo ถ้าทำได้
Paul Tarjan

อ้าวหมดโชคแล้ว ดังที่ @Kevin Reid กล่าว - คุณมีต่อไดเรกทอรีหรือต่อผู้ใช้
Blair Conrad

6

ก่อนอื่นคุณต้องย้ายไปที่โฟลเดอร์บนสุดของสำเนาการทำงานของคุณและสร้างไฟล์ที่นั่น (เช่น. svnignore) ซึ่งคุณควรวางรูปแบบทั้งหมดที่คุณต้องการละเว้นตัวอย่างเช่น (สำหรับโครงการ Android):

bin
gen
proguard
.classpath
.project
local.properties
Thumbs.db
*.apk
*.ap_
*.class
*.dex

จากนั้นคุณเรียกใช้คำสั่งต่อไปนี้ (โปรดจำไว้ว่าคุณต้องอยู่ที่โฟลเดอร์บนสุดของสำเนาการทำงานของคุณ):

svn propset svn:ignore -R -F .svnignore .

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

svn rm --keep-local <path>

ได้รับทั้งหมดนี้จากบทความดีๆที่อธิบายทั้งหมด: http://superchlorine.com/2013/08/getting-svn-to-ignore-files-and-directories/


สิ่งนี้มีประโยชน์อย่างมาก นี่เป็นวิธีที่ดีที่สุดที่ฉันพบว่าได้รับพฤติกรรมการเพิกเฉยเหมือนคอมไพล์ใน svn ขอบคุณมาก ๆ.
Jonathan Wilson

6

ในการโค่นล้ม 1.8 มากกว่าเป็นไปได้ที่จะตั้งค่า global-ignores สำหรับที่เก็บปัจจุบัน

svn propset svn:global-ignores build .
svn propset svn:global-ignores dist .

นอกจากนี้คุณสามารถสร้างโฟลเดอร์ชื่อ. svnignore และเขียนเงื่อนไข

build
dist

จำหนึ่งเงื่อนไขต่อบรรทัดการตั้งค่า build / * หรือ dist / debug นั้นเปล่าประโยชน์ จากนั้นทำตามคำสั่ง:

svn propset svn:global-ignores -F .svnignore .

ทำงานได้อย่างไม่มีที่ติ! เพียงเรียกใช้คำสั่งแรกใน repo ที่เพิ่งเช็คเอาต์
Gaurav

3

สร้างไฟล์และเพิ่มการเพิกเฉยของคุณเข้าไป

รายการแท่ง:

file1 
directory1
file2
etc...

จากนั้นใช้คำสั่งต่อไปนี้

for n in directory; do svn propset svn:ignore -F ignore-list $n; done

ไดเร็กทอรีคือชื่อไดเร็กทอรีของคุณคุณสามารถจัดหมวดหมู่ย่อยได้เช่นกันไดเร็กทอรี / ไดเร็กทอรีย่อย หรือใช้ * เพื่อบันทึกไดเร็กทอรีปัจจุบันที่คุณอยู่

นี่คือสมมติว่าคุณใช้ bash เป็นเปลือกของคุณ


อะไรคือ$ nที่นี่?
IgorGanapolsky

1
@igor Ganapolsky - $ n เป็นตัวแปรของ for loop จะถูกกำหนดให้เป็นดัชนีสำหรับลำดับที่คุณกำลังวนซ้ำ ในกรณีนี้คือไดเร็กทอรีที่ระบุโดย "ไดเร็กทอรี" ในตัวอย่างข้างต้น
jncc99

3
svn propset --recursive svn:ignore svn_ignore_rules .

โดยที่ svn_ignore_rules เป็นไฟล์ที่มีกฎการละเว้น - หนึ่งรายการต่อบรรทัด

แน่นอนว่าคุณต้องรีรันทุกครั้งที่คุณเพิ่มไดเร็กทอรีใหม่ใน repo ของคุณ

svn_ignore_rules ยังสามารถพิจารณาให้ตรวจสอบใน repo เพื่อให้ผู้ใช้รายอื่นสามารถใช้งานได้อีกครั้งโดยมีสิทธิ์เขียนไปยัง repo


2
cd parent_dir # ไดเร็กทอรีที่มีโฟลเดอร์ที่จะละเว้นแบบวนซ้ำ
svn propedit svn: ละเว้น # จะเปิด svn-prop.tmp
โฟลเดอร์ enlist (s)
^ X
ย
กระทำ -m 'เพิกเฉยต่อ Direcoty เป้าหมาย'

ช่วยให้ฉันฉันมีปัญหากับรูปแบบการตั้งค่าโฟลเดอร์, SVN ถูก complianing โฟลเดอร์ที่ไม่ได้อยู่ใน repo, set EDITOR=notepad, svn propedit svn:ignore .ทำงานได้ดี ...
Betlista

1

เนื่องจากดูเหมือนว่าจะไม่มีวิธีแก้ปัญหาสำหรับปัญหาทั่วไปนี้ฉันจึงอยากแบ่งปันวิธีแก้ปัญหาของเรา ตามที่คนอื่น ๆ ได้ระบุไว้อย่างชัดเจนแล้วคุณสามารถใช้svn:ignoreคุณสมบัตินี้ใช้ได้กับไดเร็กทอรีเดียว (ไม่ใช่สำหรับไดเร็กทอรีใหม่) หรือคุณใช้global-ignoresซึ่งใช้กับผู้ใช้รายเดียว (แต่ไม่ได้เป็นของที่เก็บ)

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

REGEDIT4

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany]
"global-ignores"="obj *.suo *.bak *.pdb *.user *.Cache*"

ฉันอยากจะขอบคุณโซลูชันภายในที่เก็บ SVN ดังนั้นถ้ามีใครรู้คุณอยากแบ่งปันหรือไม่


0

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

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