ฉันจะเพิ่มไฟล์ unversioned ทั้งหมดลงใน SVN ได้อย่างไร


177

ฉันกำลังมองหาวิธีที่ดีในการเพิ่ม 'svn add' ไฟล์ unversioned ทั้งหมดในสำเนาที่ใช้งานได้ไปยังที่เก็บ SVN ของฉัน

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

เซิร์ฟเวอร์ของฉันใช้Windows Server 2003ดังนั้นโซลูชัน Unix จะไม่ทำงาน


1
@Saul คำถามนี้มีมาก่อนอย่างชัดเจนถึงสิ่งที่คุณเชื่อมโยงดังนั้นฉันจึงไม่เห็นว่ามันจะซ้ำกันได้อย่างไร หากมีสิ่งใดคำถามอื่นซ้ำซ้อน
— Neutrino

Cygwin เป็นตัวเลือก ให้พลังของการทุบตีในทุกสภาพแวดล้อมหน้าต่าง เป็นผู้ใช้งานมานานกว่า 10 ปีและมีปัญหาเล็กน้อย
— user151841

คำตอบ:


346

svn add --force * --auto-props --parents --depth infinity -q

สุดยอดเคล็ดลับ! หนึ่งข้อสังเกต: Eclipseของฉันเพิ่มไฟล์ใหม่ลงในรายชื่อที่ไม่ใช้โดยอัตโนมัติ อาจเป็นเรื่องของการกำหนดค่า แต่อย่างใด: มี--no-ignoreตัวเลือกที่ช่วย

หลังจากนี้คุณสามารถกระทำ:

svn commit -m 'Adding a file'

14
สุดยอดเคล็ดลับ ดีกว่าการใช้สถานะ svn "svn add --force" น่าจะเพียงพอแล้ว
— ชื่อ

1
มีวิธีง่าย ๆ ในการตั้งค่านี้เป็นแมโครแบบย่อ (เช่นคุณสามารถคอมไพล์) นอกจากนี้ยังเป็นไปได้ไหมที่จะอัปเดตคำตอบนี้เพื่ออธิบายแต่ละบิต
— MrDuk

2
@MrDuk: ย่อ: alias magic="svn add --force * --auto-props --parents --depth infinity -q"- อธิบาย:svn help add
— Ronan

17
ปัญหานี้เพิ่มไฟล์ที่ถูกละเว้นหรือไม่ ไม่ต้องการ
— ladieu

1
@Name - คุณต้องใส่*ท้ายที่สุดมิฉะนั้นจะใช้งานไม่ได้ (ให้เช่าสำหรับฉัน)
— vsync

72

นี่เป็นคำถามที่แตกต่างสำหรับฉันแต่มีคำตอบอยู่ที่นั่นสำหรับคำถามนี้:

svn status | grep '?' | sed 's/^.* /svn add /' | bash

8
สิ่งนี้ใช้เครื่องมือ UNIX (grep, sed, bash) ซึ่ง OP บอกว่าเขาไม่มี
— Naaff

3
นอกจากนี้คุณยังสามารถขุดหน้าต่างและกดหน้าต่างถ้าคุณต้องการ
— Sam Saffron

1
ขออภัยสำหรับความคิดเห็นนั้นในความคิดเห็นของ cygwin นั้นไม่ได้ตั้งใจ (และฉันไม่สามารถยกเลิกได้) ในความเป็นจริงฉันคิดว่า cygwin น่าเกลียดที่สุดเท่าที่คุณจะทำได้บน Windows คุณยังสามารถใช้ findstr แทน grep ซึ่งจะทำงานได้อย่างน้อยตั้งแต่ Windows 2000 โดยไม่ต้องติดตั้งอะไรเพิ่มเติม
— Joey


2
ฉันอยู่กับ mbyrne215; คำตอบนี้ช่วยฉันได้มากกว่าโซลูชันของ OP ดังนั้นฉันจึงโหวตให้ ทำงานได้อย่างสมบูรณ์แบบใน OS X 10.6.7
— Asbjørn Ulsberg

37

งานนี้คืออะไร:

c:\work\repo1>svn add . --force

เพิ่มเนื้อหาของไดเรกทอรีย่อย

ห้ามเพิ่มไฟล์ที่ถูกละเว้น

แสดงรายการไฟล์ที่ถูกเพิ่ม

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


จริง ๆ แล้วควรเป็น.\*หรือถ้า svn root อยู่ใน dir stuff\svn_root\*อื่น
— Nux

ฉันไม่ทำตาม คำสั่งสำหรับ SVN ดำเนินการในบริบทของพา ธ ที่ถูกดำเนินการนี่เป็นสิ่งที่คาดหวัง "svn add. \ *" เพียงอย่างเดียวไม่ได้เพิ่มและพิมพ์ภาระการเตือนสแปมทำให้ไม่สามารถดูสิ่งที่เพิ่มเข้ามาได้ "svn add. \ * --force" จะทำการรีเซต แต่ยังพิมพ์ "svn: อาร์กิวเมนต์การข้าม: E200025: '. \. svn' ลงท้ายด้วยชื่อที่สงวนไว้" ดังนั้นดูเหมือนว่าจะแย่กว่าโซลูชันดั้งเดิมของฉัน
— Neutrino

ฉันกำลังชี้ให้เห็นว่าคุณอาจไม่มีไดรฟ์ C ทั้งหมดใน SVN ;-) และดังนั้นคุณควรเพิ่มเส้นทาง และจากเส้นทางทดสอบที่ระบุของฉันเนื่องจากstuff\svn_rootไม่ได้เพิ่มไฟล์ในไดเรกทอรีย่อย (เช่นในstuff\svn_root\already_in_svn\not_in_svn.txt) ดังนั้นดาวที่สิ้นสุด
— Nux

@Nux เฉพาะหลังจากนี้หลายปีฉันก็เห็นสิ่งที่คุณได้รับ :) ในคำสั่งจุดคือเส้นทางที่ระบุไดเรกทอรีปัจจุบัน โดยทั่วไปทางเลือกใด ๆ ที่ถูกต้องสามารถจัดจำหน่ายแทน
— Neutrino

นี่คือคำตอบที่ถูกต้อง ฉันไม่แน่ใจว่าโซลูชันที่มีการเพิ่มไฟล์ที่ถูกเพิกเฉยนั้นมีจุดสูงสุดอย่างไร @Neutrino แนะนำให้ลบความคิดเห็นของคุณเพื่อ Joey ที่ไม่ปรากฏในหน้านี้อีกต่อไปและเพิ่มบรรทัดที่แสดงว่าข้อเสนอแนะของคุณไม่ได้เพิ่มไฟล์ที่ถูกละเว้น
— b_levitt

35

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

svn add `svn status . | grep "^?" | awk '{print $2}'`

( ที่มา )

เมื่อคุณแก้ไขปัญหาสำหรับ Windows ได้แล้วนี่เป็นโซลูชัน UNIX (ติดตาม Sam) ฉันเพิ่มที่นี่เนื่องจากฉันคิดว่ามันยังคงมีประโยชน์สำหรับผู้ที่มาถึงคำถามนี้เพื่อขอสิ่งเดียวกัน (เนื่องจากชื่อไม่รวมคำหลัก "WINDOWS")

หมายเหตุ (ก.พ. , 2015): ตามความเห็นโดย "bdrx" คำสั่งดังกล่าวสามารถทำให้ง่ายขึ้นด้วยวิธีนี้:

 svn add `svn status . | awk '/^[?]/{print $2}'`

1
นิสัยดีกระชับกระชับยังให้ยืมตัวเองได้ค่อนข้างดี ขอบคุณ
— นอร์แมน H

1
ยิ่งใหญ่ นอกจากนี้ยังง่ายต่อการขยายแก้ไขลบ ฯลฯ
— Drewid

สมบูรณ์แบบสำหรับสิ่งที่ฉันต้องการ ขอบคุณ!
— Jeff

2
ทำไมคนมักจะ grep แล้วท่อไป awk? Awk สามารถทำการจับคู่รูปแบบ: awk '/^[?]/{print $2}'; ไม่จำเป็นต้องมีกระบวนการ grep พิเศษ
— bdrx

1
@bdrx: อาจเป็นเพราะ grep มักจะเกี่ยวข้องกับการจับคู่รูปแบบ? ในกรณีส่วนบุคคลของฉันฉันมีประสบการณ์กับ grep มากกว่าด้วย awk ฉันไม่ทราบว่าคุณสามารถทำสิ่งต่าง ๆ ใน awk ดังนั้นฉันจะเริ่มใช้ awk เพิ่มเติมในสคริปต์ของฉัน ขอบคุณ!
— lepe

5
svn add --force .

สิ่งนี้จะเพิ่มไฟล์ที่ไม่มีเวอร์ชันใด ๆ ในไดเรกทอรีปัจจุบันและไดเรกทอรีลูกที่เป็นเวอร์ชันทั้งหมด


5

วิธีนี้ควรจัดการกับชื่อไฟล์ที่มีจำนวน / การรวมกันของช่องว่างในพวกเขา ...

svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"

นี่คือคำอธิบายว่าคำสั่งนั้นทำอะไร:

  • แสดงรายการไฟล์ที่เปลี่ยนแปลงทั้งหมด
  • จำกัด รายการนี้เป็นบรรทัดด้วย '?' ที่จุดเริ่มต้น - คือไฟล์ใหม่
  • ลบเครื่องหมาย '?' อักขระที่จุดเริ่มต้นของบรรทัด
  • ลบช่องว่างที่จุดเริ่มต้นของบรรทัด
  • ไพพ์ชื่อไฟล์เป็น xargs เพื่อรัน svn เพิ่มหลายครั้ง

ใช้อาร์กิวเมนต์ -i เพื่อ xargs เพื่อจัดการความสามารถในการนำเข้าชื่อไฟล์ด้วยช่องว่างใน 'svn add' - โดยทั่วไปแล้ว -i ตั้งค่า {} เพื่อใช้เป็นตัวยึดตำแหน่งเพื่อให้เราสามารถใส่อักขระ "รอบชื่อไฟล์ที่ใช้โดย 'svn เพิ่ม'.

ข้อดีของวิธีนี้คือควรจัดการชื่อไฟล์ด้วยช่องว่าง


สิ่งนี้สันนิษฐานว่า Linux หรือคล้ายกัน (เช่นMinGWหรือCygwin ) OP ระบุไว้: "เซิร์ฟเวอร์ของฉันใช้ Windows Server 2003 ดังนั้นโซลูชัน Unix จะไม่ทำงาน"
— Peter Mortensen

4

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


ด้วยพื้นที่เก็บข้อมูลขนาดใหญ่ TortoiseSVN หยุดทำงาน นี่ทำให้ฉันมองหาทางเลือกบรรทัดคำสั่ง :-)
— Upendra


3

ใช้:

svn st | grep ? | cut -d? -f2 | xargs svn add

1
หรือคุณสามารถใช้ตัดการทำงานของ grep: svn status | cut -d ? -f 2 -s | xargs svn add
— Eric3

สิ่งนี้สันนิษฐานว่า Linux หรือคล้ายกัน (เช่นMinGWหรือCygwin ) OP ระบุไว้: "เซิร์ฟเวอร์ของฉันใช้ Windows Server 2003 ดังนั้นโซลูชัน Unix จะไม่ทำงาน"
— Peter Mortensen

3

ฉันมักจะใช้:

คัดลอกวาง

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1

1
Op explicity ระบุว่าโซลูชัน Unix นั้นไม่มีประโยชน์สำหรับเขา
— ตริโน

สิ่งนี้สันนิษฐานว่า Linux หรือคล้ายกัน (เช่นMinGWหรือCygwin ) OP ระบุไว้: "เซิร์ฟเวอร์ของฉันใช้ Windows Server 2003 ดังนั้นโซลูชัน Unix จะไม่ทำงาน"
— Peter Mortensen

3

เนื่องจากโพสต์นี้ติดแท็ก Windows ฉันคิดว่าฉันจะหาทางออกสำหรับ Windows ฉันต้องการทำให้กระบวนการเป็นอัตโนมัติและฉันสร้างไฟล์แบ็ต ฉันต่อต้านการสร้าง console.exe ใน C #

ฉันต้องการเพิ่มไฟล์หรือโฟลเดอร์ใด ๆ ที่ไม่ได้เพิ่มในที่เก็บของฉันเมื่อฉันเริ่มกระบวนการส่งมอบ

ปัญหากับคำตอบมากมายคือพวกเขาจะทำรายการไฟล์ที่ไม่ผ่านซึ่งควรละเว้นตามรายการที่ไม่สนใจของฉันในTortoiseSVN TortoiseSVN

นี่คือการตั้งค่าเบ็ดของฉันและไฟล์ชุดที่ทำ

Tortoise Hook Script:

"start_commit_hook".
(where I checkout) working copy path = C:\Projects
command line: C:\windows\system32\cmd.exe /c C:\Tools\SVN\svnadd.bat
(X) Wait for the script to finish
(X) (Optional) Hide script while running
(X) Always execute the script

svnadd.bat

@echo off

rem Iterates each line result from the command which lists files/folders
rem     not added to source control while respecting the ignore list.
FOR /F "delims==" %%G IN ('svn status ^| findstr "^?"') DO call :DoSVNAdd "%%G"
goto end

:DoSVNAdd
set addPath=%1
rem Remove line prefix formatting from svn status command output as well as
rem    quotes from the G call (as required for long folder names). Then
rem    place quotes back around the path for the SVN add call.
set addPath="%addPath:~9,-1%"
svn add %addPath%

:end

2
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%i %%j"

ภายในการติดตั้งนี้คุณจะประสบปัญหาในกรณีที่โฟลเดอร์ / ชื่อไฟล์ของคุณมีมากกว่าหนึ่งช่องว่างดังนี้:

"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Sega Mega      2"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\One space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Double  space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Single"

กรณีดังกล่าวครอบคลุมโดยง่าย:

for /f "usebackq tokens=1*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%j"

2

หากคุณใช้ Linux หรือใช้ Cygwin หรือ MinGW ใน windows คุณสามารถใช้โซลูชันที่คล้าย bash ได้ดังต่อไปนี้ ตรงกันข้ามกับสิ่งที่คล้ายกันที่แสดงที่นี่อันนี้คำนึงถึงช่องว่างชื่อไฟล์บัญชี:

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done

นี่มีไว้เพื่ออะไร? CMD? ทุบตี? ดูเหมือนว่า Bash (หรือเชลล์ที่คล้ายกัน) ในกรณีดังกล่าวจะถือว่า Linux หรือคล้ายกัน (เช่นMinGWหรือCygwin ) OP ระบุไว้: "เซิร์ฟเวอร์ของฉันใช้ Windows Server 2003 ดังนั้นโซลูชัน Unix จะไม่ทำงาน"
— Peter Mortensen

ขอบคุณคุณพูดถูกเมื่อฉันอยู่ใน Windows ฉันใช้ Cygwin กับ Bash อย่างไรก็ตามคำสั่ง "เซิร์ฟเวอร์ของฉันใช้ Windows Server 2003 ดังนั้นโซลูชัน Unix จะไม่ทำงาน" เป็นเท็จ บางทีเขาอาจไม่ต้องการใช้ Cygwin หรือ MinGW แต่เขาไม่ได้แสดงออกมาในทางนั้น ฉันปฏิรูปการตอบสนอง
— ajaest

1

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

FOR /F %F IN ('dir /s /b /a:d') DO svn add --depth=empty "%F"
FOR /F %F IN ('dir /s /b /a *.cs *.csproj *.rpt *.xsd *.resx *.ico *.sql') DO svn add "%F"

ต่อไปนี้เป็นคำอธิบาย

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

ให้ฉันให้รายละเอียดเพิ่มเติม:

  • สำหรับ: คุณรู้ว่าการควบคุมวง
  • / F: หมายถึงใช้ไฟล์และไดเรกทอรี (ไม่แน่ใจอย่างแน่นอน)
  • % F: ตัวแปร มันจะถือว่าค่าของแต่ละไฟล์ที่ระบุไว้ในแต่ละครั้ง; มันอาจมีอีกหนึ่งตัวอักษรชื่อ
  • ใน: ไม่จำเป็นต้องอธิบายใช่มั้ย
  • ('dir / s / b / a: d'): คำสั่ง DOS ที่จะแสดงรายการไดเรกทอรี ในกรณีของฉัน / s ซ้ำ recursive / b จะใช้เส้นทางเท่านั้นเต็ม / a: d หมายถึงเฉพาะไดเรกทอรี; เปลี่ยนมันตามที่คุณต้องการเก็บวงเล็บและเครื่องหมายอัญประกาศเดี่ยว
  • ทำ: หมายความว่าสิ่งที่มาถัดไปในคำสั่งคือสิ่งที่จะถูกดำเนินการสำหรับแต่ละไดเรกทอรี
  • svn add --depth = empty: มันเป็นคำสั่ง SVN ที่ต้องการให้รัน นิยามเชิงลึกหมายถึงการเพิ่มเฉพาะไดเรกทอรีและไม่ใช่ไฟล์ที่อยู่ภายใน
  • "% F": นั่นคือวิธีที่คุณใช้ตัวแปรที่กำหนดไว้ก่อนหน้า

ในคำสั่งที่สองความแตกต่างเพียงอย่างเดียวคือคำสั่ง dir และคำสั่ง svn ฉันคิดว่ามันชัดเจนเพียงพอ


0

คุณสามารถใช้คำสั่ง

svn add * force--

หรือ

svn add <directory/file name>

หากไฟล์ / ไดเรกทอรีของคุณไม่ได้เพิ่มซ้ำ จากนั้นตรวจสอบสิ่งนี้

ซ้ำเพิ่มเป็นทรัพย์สินเริ่มต้น คุณสามารถเห็นในหนังสือ SVN

ปัญหาอาจอยู่ในรายชื่อที่ไม่ใช้หรือคุณสมบัติส่วนกลาง

ฉันได้รับการแก้ไขปัญหาการติดตามของ Google

ตรวจสอบคุณสมบัติส่วนกลางเพื่อดูดาว (*)

  • คลิกขวาใน repo ของคุณในหน้าต่าง TortoiseSVN > Propertiesเลือก
  • ดูว่าคุณไม่มีทรัพย์สินหรือไม่ svn:global-ignores with a value of *
  • หากคุณมีคุณสมบัติพร้อมstar(*)จะละเว้นการเพิ่มแบบเรียกซ้ำ ดังนั้นลบคุณสมบัตินี้

ตรวจสอบรูปแบบการเพิกเฉยต่อทั่วโลกเพื่อดูดาว (*)

  • คลิกขวาใน repo ของคุณในหน้าต่าง TortoiseSVN > Settings > Generalเลือก
  • เห็นในทั่วโลกไม่สนใจรูปแบบถ้าคุณไม่ได้มีชุดดาว (*)มี
  • หากคุณพบstar(*)ให้ลบคุณสมบัตินี้

ผู้ชายคนนี้ยังอธิบายว่าทำไมคุณสมบัตินี้เพิ่มในโครงการของฉัน

วิธีที่เหมือนกันมากที่สุดคือมีคนคลิกขวาที่ไฟล์โดยไม่มีนามสกุลและเลือก TortoiseSVN -> SVN Ignore -> * (เรียกซ้ำ) และทำสิ่งนี้ซ้ำ

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



0

เนื่องจากเขาระบุ Windows โดยที่ awk & sed ไม่ใช่มาตรฐาน:

for /f "tokens=1*" %e in ('svn status^|findstr "^\?"') do svn add "%f"

หรือในแบทช์ไฟล์:

for /f "tokens=1*" %%e in ('svn status^|findstr "^\?"') do svn add "%%f"

0

นี่เป็นวิธีที่ขี้เกียจและอันตรายในการซิงโครไนซ์ไดเรกทอรีกับ SVN รวมถึงไฟล์ใหม่:

svn rm --keep-local dir
svn add dir

แม้ว่าสิ่งนี้สามารถทำงานได้อย่างรวดเร็ว แต่ก็สามารถมีผลกระทบร้ายแรงเช่นกัน ตัวอย่างเช่น SVN มักจะสูญเสียการติดตามประวัติของไฟล์

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


-1

ฉันคิดว่าฉันทำสิ่งที่คล้ายกับ:

svn add . --recursive

แต่ไม่แน่ใจว่าหน่วยความจำของฉันถูกต้อง ;-p


2
เพียงแค่อัปเดตสำหรับหน่วยความจำของคุณ: svn 1.4 และ 1.5 ไม่รองรับ - เรียกคืนเป็นพารามิเตอร์สำหรับ svn add :)
— Ludwig Wensauer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.