ฉันจะข้ามไดเรกทอรีด้วย SVN ได้อย่างไร


760

ฉันเพิ่งเริ่มใช้ SVN และฉันมีไดเรกทอรีแคชที่ฉันไม่ต้องการภายใต้การควบคุมแหล่งที่มา ฉันจะเพิกเฉยไดเรกทอรี / โฟลเดอร์ทั้งหมดด้วย SVN ได้อย่างไร

ฉันใช้รุ่นและTextMateบน OS X และ commandline


3
คำถามที่คล้ายกันตอบที่นี่ [โฟลเดอร์ SVN ไม่ต้องชำระเงิน] [1] [1]: stackoverflow.com/questions/192824/svn-checkout-ignore-folder
mloskot

สำเนาที่เป็นไปได้ของฉันจะละเว้นไฟล์ในการโค่นล้มได้อย่างไร (ผมไม่ได้ดูแลมากเกินไปซึ่งวิธีที่ซ้ำกันไป; ค่าชุดของคำตอบที่จะเห็นได้ชัดที่ดีขึ้นกว่าที่อื่น ๆ .)
เจฟฟรีย์ Bosboom

คำตอบ:


796

ตั้งค่าsvn:ignoreคุณสมบัติของไดเรกทอรีหลัก:

svn propset svn:ignore dirname .

หากคุณมีหลายสิ่งที่ต้องเพิกเฉยให้คั่นด้วยการขึ้นบรรทัดใหม่ในค่าคุณสมบัติ ในกรณีนั้นการแก้ไขค่าคุณสมบัติโดยใช้เครื่องมือแก้ไขภายนอกทำได้ง่ายกว่า:

svn propedit svn:ignore .

2
@Kouber: ปัญหาของคุณคือการขยายตัวของเชลล์ไม่ทราบเกี่ยวกับ svn: ละเว้นคุณสมบัติ ดังนั้นการใช้ '*' เป็นพารามิเตอร์ explicityl ส่งผ่าน tmp ไปยังคำสั่ง commit ลองใช้บางอย่างเช่น 'svn commit -m "เน้นเสียงมากขึ้น"
MarkusSchaber

4
ขอบคุณสำหรับคำตอบ. Pico เป็นบรรณาธิการ: svn propedit svn: ละเว้น --editor-cmd pico
hade

157
หมายเหตุ: สิ่งนี้จะไม่ทำงานหากไดเรกทอรีมี "ใน" svn อยู่แล้ว svn rm --keep-local dirnameเป็นครั้งแรก (เอาท์พุท svn สถิติของฉันมีขนาดใหญ่มากและฉันกระแทกหัวของฉันในนี้ในขณะที่.)
Erik Aronesty

10
หากคุณต้องการละเว้นไฟล์ / โฟลเดอร์มากกว่าหนึ่งไฟล์ให้เพิ่มชื่อทั้งหมดลงในไฟล์ txt หนึ่งบรรทัดต่อหนึ่งบรรทัดและใช้ตัวแปรต่อไปนี้:svn propset svn:ignore -F file.txt .
petervaz

2
ระวังว่าคุณตั้งไว้svn:ignoreและไม่svn::ignoreเหมือนที่ฉันทำ คุณสามารถตั้งค่าคุณสมบัติตามอำเภอใจดังนั้นคุณสมบัติหลังจะตั้งค่าเป็น OK และคุณสามารถดูและแก้ไขคุณสมบัติได้ แต่จะไม่ทำให้ SVN เพิกเฉยต่อไฟล์ที่คุณแสดงรายการ
Richard Turner

406

นี่คือโครงสร้างไดเรกทอรีตัวอย่าง:

\project
    \source
    \cache
    \other

เมื่อในprojectคุณเห็นว่าแคชไดเรกทอรีของคุณจะไม่ถูกเพิ่มและแสดงเช่น

> svn st
M  source
?  cache

ในการตั้งค่าคุณสมบัติเพิกเฉยให้ทำ

svn propset svn: ละเว้นแคช

โดยที่svn:ignoreชื่อของคุณสมบัติที่คุณตั้งค่าcacheคือค่าของคุณสมบัติและ.เป็นไดเรกทอรีที่คุณตั้งค่าคุณสมบัตินี้ มันควรจะเป็นไดเรกทอรีหลักของcacheไดเรกทอรีที่ต้องการคุณสมบัติ

วิธีตรวจสอบคุณสมบัติที่ตั้งค่าไว้:

> svn proplist
Properties on '.':
  svn:ignore

เพื่อดูค่าของsvn:ignore:

> svn propget svn:ignore
cache

หากต้องการลบคุณสมบัติที่ตั้งไว้ก่อนหน้านี้:

svn propdel svn:ignore

17
จุดหนึ่งที่ยากที่นี่ที่ฉันสะดุด ให้แน่ใจว่าคุณไม่ได้dirnameเพิ่มเฉือนท้ายเพื่อ ตัวอย่างเช่นเมื่อพิมพ์svn propset svn:ignore dirnameหากคุณอนุญาตให้เชลล์ (bash) กรอกข้อมูล dirname ให้คุณมันจะเพิ่มเครื่องหมายสแลชต่อท้ายทำให้คุณมีคำสั่งsvn propset svn:ignore dirname/ซึ่งจะไม่ส่งผลให้โฟลเดอร์นั้นถูกเพิกเฉย อย่างน้อยนั่นคือประสบการณ์ของฉัน
David Weinraub

4
dir 'cache' จะยังคงแสดงอยู่ใน 'svn st' มีวิธีลบออกจากมุมมองหรือไม่ (ไม่มีการลบจากดิสก์)
Tom Brito

131

สิ่งสำคัญที่ต้องพูดถึง:

ใน commandline คุณไม่สามารถใช้

svn add *

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

svn add --force .

ทำอย่างที่ @binco กล่าวว่าsvn add --force *จะไม่ทำงาน ใช้จุดไม่ใช่ดาว
manuell

80

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

ฉันรู้ว่าดูเหมือนชัดเจน แต่พวกเขายังคงปรากฏ?ในsvn statusรายการของฉันเมื่อฉันคิดว่ามันจะไม่สนใจพวกเขาในพื้นที่


8
อย่าลืมใช้ตัวเลือก --keep-local เมื่อทำการลบไฟล์หากคุณต้องการที่จะเพิกเฉยและไม่ได้ลบมันจริงๆ
Dylan Holmes

71

หากต้องการขยายออกไปเล็กน้อยหากคุณทำเช่นนี้ด้วยเครื่องมือบรรทัดคำสั่ง svn คุณต้องการพิมพ์:

svn propedit svn:ignore path/to/dir

ซึ่งจะเปิดโปรแกรมแก้ไขข้อความที่คุณเลือกจากนั้นพิมพ์ '*' เพื่อละเว้นทุกสิ่งที่อยู่ข้างในและบันทึก + ออก - ซึ่งจะรวมไดเรกทอรีของตัวเองใน svn แต่ไม่ต้องสนใจไฟล์ทั้งหมดที่อยู่ภายในเพื่อละเว้นไดเรกทอรีใช้ เส้นทางของพาเรนต์แล้วพิมพ์ชื่อของไดเรกทอรีในไฟล์ หลังจากบันทึกแล้วให้เรียกใช้การอัปเดต ('svn up') จากนั้นตรวจสอบในเส้นทางที่เหมาะสม


8
จุดดีมากขอบคุณ คำตอบอื่น ๆ ทั้งหมดพลาดกรณีของไดเรกทอรีที่ซ้อนกัน ดังนั้นตัวอย่างข้างต้น (ใช้งานได้) จากนั้นคุณพิมพ์ตัวแก้ไขละเว้น_directory (ซึ่งโดยสมมุติว่าหนึ่งระดับต่ำกว่าพา ธ / ถึง / dir) สิ่งนี้จะไม่ทำงานแม้ว่า: svn propedit svn: ละเว้น จากนั้นพิมพ์ path / to / dir / ละเว้น_directoryในโปรแกรมแก้ไข IOW: SVN จับคู่วัตถุทีละหนึ่งระดับในเวลาเดียวกัน
greenoldman

30

ตั้งค่า svn:ignoreคุณสมบัติในไดเรกทอรีหลัก:

$ cd parentdir
$ svn ps svn:ignore . 'cachedir'

สิ่งนี้จะเขียนทับค่าปัจจุบันของ svn:ignoreในปัจจุบันของ คุณแก้ไขค่าด้วย:

$ svn pe svn:ignore .

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

คุณสามารถดูค่าปัจจุบันด้วย:

$ svn pg svn:ignore .

หากคุณใช้ GUI ควรมีตัวเลือกเมนูสำหรับทำสิ่งนี้


3
svn ps svn:ignore . 'cachedir'cachedir is not under version controlผลในการ เปลี่ยนเป็นsvn ps svn:ignore 'cachedir' .ทำงานให้ฉัน
DiCaprio

21

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


เมื่อโฟลเดอร์อยู่ภายใต้การควบคุมการแก้ไขแล้ว

หลังจากsvn importและsvn coไฟล์สิ่งที่เรามักจะทำเป็นครั้งแรก

แคชรันไทม์ทั้งหมด, ไฟล์แนบจะอยู่ภายใต้การควบคุมเวอร์ชัน ดังนั้นก่อนsvn ps svn: ละเว้นเราต้องลบมันออกจากที่เก็บ

ด้วย SVN เวอร์ชั่น 1.5 ขึ้นไปเราสามารถใช้ได้svn del --keep-local your_folderแต่สำหรับเวอร์ชั่นก่อนหน้านี้ทางออกของฉันคือ:

  1. svn ส่งออกสำเนาใหม่ทั้งหมดของโฟลเดอร์ของคุณ (ไม่มี.svnโฟลเดอร์ที่ซ่อนอยู่)
  2. svn del local และ repository
  3. svn ci
  4. คัดลอกโฟลเดอร์กลับ
  5. ทำSVN เซนต์และยืนยันโฟลเดอร์ที่มีการตั้งค่าสถานะเป็น '?'
  6. ตอนนี้เราสามารถทำsvn psตามแนวทางแก้ไข

เมื่อเราต้องการมากกว่าหนึ่งโฟลเดอร์ที่จะถูกละเว้น

  • ในไดเรกทอรีเดียวฉันมีสองโฟลเดอร์ที่ต้องตั้งค่าเป็น svn:ignore
  • หากเราตั้งค่าอีกอันหนึ่งจะถูกลบออก
  • จากนั้นเราสงสัยว่าเราต้องการsvn pe

svn peจะต้องแก้ไขไฟล์ข้อความและคุณสามารถใช้คำสั่งนี้หากจำเป็นต้องตั้งค่าตัวแก้ไขข้อความของคุณโดยใช้vi :

export SVN_EDITOR=vi
  1. ด้วย "o" คุณสามารถเปิดบรรทัดใหม่
  2. พิมพ์ชื่อโฟลเดอร์ทั้งหมดที่คุณต้องการละเว้น
  3. กดปุ่ม 'esc' เพื่อหนีจากโหมดแก้ไข
  4. พิมพ์ ": wq" จากนั้นกดEnterเพื่อบันทึกและออก

ไฟล์มีลักษณะบางอย่างเช่นนี้:

runtime
cache
attachments
assets

คุณยังสามารถใช้svn propset svn:ignore -F .ignorethesefiles .ซึ่งจะใช้เนื้อหาของไฟล์ ฉันชอบเก็บมันไว้รอบ ๆ เพื่อที่คุณจะได้รู้ว่ามีอะไรถูกละเว้น การแก้ไขต้องใช้ชุดอุปกรณ์ติดตามผล
เจอราร์ดโอนีล

20

ลบออกก่อน ...

หากไดเรกทอรีของคุณfooอยู่ภายใต้การควบคุมเวอร์ชันอยู่แล้วให้ลบออกก่อนด้วย:

svn rm --keep-local foo

... จากนั้นไม่สนใจ:

svn propset svn:ignore foo .

12

... และถ้าคุณต้องการละเว้นมากกว่าหนึ่งไดเรกทอรี (พูดbuild/ temp/และ*.tmpไฟล์) คุณสามารถทำได้ในสองขั้นตอน (ไม่สนใจคุณสมบัติแรกและแก้ไขคุณสมบัติเพิกเฉย (ดูคำตอบอื่นที่นี่) หรือเขียนสิ่งที่ชอบ

svn propset svn:ignore "build
temp
*.tmp" .

บนบรรทัดคำสั่ง



9

คำสั่งให้ละเว้นหลายรายการเป็นเรื่องยุ่งยากเล็กน้อยและต้องใช้แบ็กสแลช

svn propset svn:ignore "cache\
tmp\
null\
and_so_on" .

คำสั่งนี้จะไม่สนใจอะไรชื่อcache, tmp, nullและand_so_onในไดเรกทอรีปัจจุบัน


6
และเพื่อชี้แจง: แบ็กสแลชที่นี่ไม่ใช่คุณสมบัติของ svn; เป็นวิธีป้อนสตริงหลายบรรทัดบนเชลล์ คุณสามารถใช้โปรแกรมแก้ไขและเขียนหลายบรรทัดได้
sleske

ไม่จำเป็นต้องใช้แบ็กสแลชเพื่อทุบตี bash ฉลาดพอที่จะรู้ว่า "เปิดอยู่และไม่ประมวลผลบรรทัดสิ่งที่คุณต้องทำคือกด Enter หลังจากแคช tmp และ null คุณจะเห็นว่า bash เปลี่ยนพร้อมท์เป็น> เพื่อให้คุณรู้ว่าคุณ ยังคงป้อนคำสั่งอีกทางเลือกหนึ่งคือเริ่มพิมพ์คำสั่ง (svn) จากนั้นกด esc แล้ว v. ที่จะให้คุณป้อนคำสั่งในโปรแกรมแก้ไขกด ZZ เมื่อเสร็จสิ้นการเรียกใช้คำสั่งหากคุณเปลี่ยนใจ และไม่ต้องการที่จะดำเนินการแล้ว: q!.
Michael Potter

1
svn propset svn:ignore -F .ignorethesefiles .จะอนุญาตให้คุณใช้ไฟล์ และตามที่กล่าวไว้คุณมีกำลังใจเสมอ
เจอราร์ดโอนีล

5

ฉันมีปัญหาในการลบไดเรกทอรีที่ซ้อนทับ ไดเรกทอรีบนสุดที่ฉันต้องการเพิกเฉยจะไม่แสดงด้วย 'สถานะ svn' แต่ส่วนย่อยทั้งหมดได้ นี่อาจเห็นได้ชัดกับคนอื่น แต่ฉันคิดว่าฉันต้องการแบ่งปัน:

ตัวอย่าง:

/กระโปรงหลังรถ

/ ลำ / แคช

/ ลำ / แคช / subdir1

/ ลำ / แคช / subdir2

cd /trunk
svn ps svn:ignore . /cache
cd /trunk/cache
svn ps svn:ignore . *
svn ci

4

"ขอบคุณ"svnสำหรับวิธีการที่น่ากลัวปลอมและยากที่จะเพิกเฉยต่อไฟล์

ดังนั้นฉันจึงเขียนสคริปต์svn-ละเว้น-all :

#!/bin/sh

# svn-ignore-all

# usage: 
#   1. run svn status to see what is going on at each step 
#   2. add or commit all files that you DO want to have in svn
#   3. remove any random files that you don't want to svn:ignore
#   4. run this script to svn:ignore everything marked '?' in output of `svn status`

svn status |
grep '^?' |
sed 's/^? *//' |
while read f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

นอกจากนี้หากต้องการละเว้นรายการไฟล์ / ชื่อพา ธ เฉพาะเราสามารถใช้ตัวแปรsvn-ละเว้นนี้ ฉันคิดว่า svn-ละเว้น - ทั้งหมดควรเป็นเหมือน xargs svn-ละเว้น

#!/bin/sh

# svn-ignore

# usage:
#   svn-ignore file/to/ignore ...

for f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

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


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

ไม่ฉันไม่ได้ใช้จริงๆ! เพียงแค่พยายามทำความสะอาดไฟล์ของฉัน
Sam Watkins


3

หากไดเร็กทอรีโปรเจ็กต์ของคุณชื่อ / Project และแคชไดเร็กทอรีของคุณชื่อ / Project / Cache ดังนั้นคุณต้องตั้งค่าคุณสมบัติการโค่นล้มบน / Project ชื่อคุณสมบัติควรเป็น "svn: ละเว้น" และค่าคุณสมบัติควรเป็น "Cache"

อ้างถึงหน้านี้ในคู่มือการโค่นล้มสำหรับคุณสมบัติเพิ่มเติม


3

คำตอบของ Jason จะทำเคล็ดลับ อย่างไรก็ตามแทนที่จะตั้งค่า svn: ละเว้นเป็น "." ในไดเรกทอรีแคชคุณอาจต้องการรวม "แคช" ในคุณสมบัติ svn: ละเว้นของไดเรกทอรีหลักในกรณีที่ไดเรกทอรีแคชไม่ปรากฏขึ้นเสมอ ฉันทำสิ่งนี้กับโฟลเดอร์ "throwaway" จำนวนหนึ่ง


3

เพื่อให้ผู้อำนวยการที่ SVN จะไม่ทราบ:

  1. สิ่งนี้จะลบไฟล์ออกจากที่เก็บ แต่เก็บไดเรกทอรีไว้ภายใต้การควบคุม SVN:

svn delete --keep-local path / directory_to_keep / *

  1. จากนั้นตั้งค่าให้ละเว้นไดเรกทอรี (และเนื้อหาทั้งหมด):

svn propset svn: ละเว้น "*" path / directory_to_keep


2

หากคุณใช้ส่วนหน้าสำหรับ SVN เช่น TortoiseSVN หรือการรวม IDE บางประเภทก็ควรมีตัวเลือกการเพิกเฉยในเมนูเดียวกับการดำเนินการส่งข้อมูล / เพิ่ม


1

ตั้ง SVN นี้ไม่สนใจทรัพย์สิน เครื่องมือ svn UI ส่วนใหญ่มีวิธีการทำเช่นนี้เช่นเดียวกับการอภิปรายบรรทัดคำสั่งในลิงค์


1

เนื่องจากคุณใช้เวอร์ชันมันง่ายมากจริง ๆ :

  • เรียกดูสำเนาเช็คเอาต์ของคุณ
  • คลิกที่ไดเรกทอรีเพื่อละเว้น
  • ในช่อง "เพิกเฉยที่ด้านขวาคลิกแก้ไข
  • พิมพ์ *. * เพื่อละเว้นไฟล์ทั้งหมด (หรือ * .jpg สำหรับไฟล์ jpg เป็นต้น)

1

ชมการกรีดของคุณต่อท้ายด้วย ฉันพบว่ารวมทั้งในแฟ้มละเว้นการตั้งค่าของฉันไม่ได้ละเลยimages/* ./images/เมื่อฉันวิ่งก็ยังคงแสดงให้เห็นว่าsvn status -u ? imagesดังนั้นฉันเพิ่งเปลี่ยนการตั้งค่าการเพิกเฉยเป็นเพียงimagesไม่มีเครื่องหมายทับ เรียกใช้การตรวจสอบสถานะและลบออก


1

แก้ไขด้วยEclipseในวิธีถัดไป:

ก่อนอื่นทำการซิงโครไนซ์โฟลเดอร์ของคุณกับโครงการ:

ทีม -> ประสาน

ในมุมมองถัดไปมุมมองทีมคุณสามารถดูทรัพยากรทั้งหมดที่คุณสามารถส่งไปยังเซิร์ฟเวอร์ SVN

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

ทีมงาน -> svn:ignoreเพิ่ม

หลังจากนั้นในหน้าต่างการยืนยันให้เลือกตัวเลือกแรก: "ไม่สนใจด้วยชื่อ"

ตัวอย่างเช่นหากฉันต้องการเพิกเฉยโฟลเดอร์เป้าหมายและทรัพยากรระดับ. ฉันจะซิงโครไนซ์และในมุมมองซิงโครไนซ์ฉันจะเลือกโฟลเดอร์เป้าหมาย หลังจากนั้นฉันจะเลือก

ทีมงาน> เพิ่ม

ถึงsvn:ignoreแล้วฉันจะยืนยันตัวเลือกแรกในหน้าต่างยืนยัน


0

หลังจากเสียเวลามากในการหาวิธีทำกิจกรรมง่ายๆนี้ฉันตัดสินใจโพสต์มันไม่ยากที่จะหาคำอธิบายที่เหมาะสม

ก่อนอื่นให้โครงสร้างตัวอย่าง

$ svn st? โครงการ / ลำต้น / เป้าหมาย? โครงการ / ลำ / myfile.x

1 - ก่อนกำหนดค่าตัวแก้ไขใน mycase vim export SVN_EDITOR = vim

2 -“ svn propedit svn: ละเว้นโปรเจ็กต์ / trunk /” จะเปิดไฟล์ใหม่และคุณสามารถเพิ่มไฟล์และไดเรกทอรีย่อยของคุณในกรณีที่เราพิมพ์“ เป้าหมาย” บันทึกและปิดไฟล์และงาน

$ svn st? โครงการ / ลำ / myfile.x

ขอบคุณ

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