ฉันจะเพิ่มไฟล์ 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.