ลบไฟล์ที่ไม่ได้เวอร์ชัน Subversion โดยอัตโนมัติ


111

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


7
ฉันเป็นผู้ใช้ SVN และได้เปรียบเทียบ Git กับ SVN เพื่อดูว่าในที่สุดฉันต้องการเปลี่ยนหรือไม่ ดูเหมือนว่านี่อาจเป็นอีกตัวอย่างหนึ่งที่ Git ใช้คำสั่ง "git clean"
jpierson

3
หรือhg purge --allใน Mercurial.
Brendan Long

สำเนาstackoverflow.com/questions/2803823/…ซึ่งมีกิจกรรมที่เป็นประโยชน์มากมาย
Heath Raftery

คำตอบ:


26

แก้ไข:

การโค่นล้ม 1.9.0 แนะนำตัวเลือกในการทำสิ่งนี้:

svn cleanup --remove-unversioned

ก่อนหน้านั้นฉันใช้สคริปต์ python นี้เพื่อทำสิ่งนั้น:

import os
import re

def removeall(path):
    if not os.path.isdir(path):
        os.remove(path)
        return
    files=os.listdir(path)
    for x in files:
        fullpath=os.path.join(path, x)
        if os.path.isfile(fullpath):
            os.remove(fullpath)
        elif os.path.isdir(fullpath):
            removeall(fullpath)
    os.rmdir(path)

unversionedRex = re.compile('^ ?[\?ID] *[1-9 ]*[a-zA-Z]* +(.*)')
for l in  os.popen('svn status --no-ignore -v').readlines():
    match = unversionedRex.match(l)
    if match: removeall(match.group(1))

ดูเหมือนว่าจะทำงานได้ดี


1
ยังคงใช้งานได้สำหรับฉันกับ Python 2.7.2 Warren P: คุณสามารถให้รายละเอียดเพิ่มเติมได้หรือไม่?
Thomas Watnedal

ฉันคิดว่ามันเป็นปัญหากับ Python 2.6 ใช้งานได้อีกครั้งสำหรับฉันใน 2.7
Warren P

1
โหวตลง: วิธีแก้ปัญหาอื่น ๆ จากการร้องsvn cleanup --remove-unversionedดีกว่า และมีไว้สำหรับ Subversion 1.9.0 (เวอร์ชันนี้มาจากปี 2015) มีความเสถียรและเป็นมาตรฐาน
tres 14159

138

สิ่งนี้ใช้ได้กับฉันในการทุบตี:

 svn status | egrep '^\?' | cut -c8- | xargs rm

Seth Renoดีกว่า:

svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r 

จัดการโฟลเดอร์และช่องว่างที่ไม่ได้แปลงในชื่อไฟล์

ตามความคิดเห็นด้านล่างนี้ใช้ได้เฉพาะกับไฟล์ที่การโค่นล้มไม่ทราบ (status =?) อะไรก็ตามที่การโค่นล้มทำทราบเกี่ยวกับ (รวมถึงไฟล์ละเว้น / โฟลเดอร์) จะไม่ถูกลบ

หากคุณกำลังใช้การโค่นล้ม 1.9 หรือสูงกว่าคุณสามารถใช้คำสั่งsvn cleanupด้วยตัวเลือก --remove-unversioned และ --remove-ignored


6
ยังใช้งานได้ใน Windows ใน cygwin
Honza

9
คุณอาจพิจารณาเพิ่มอ็อพชัน -d ให้กับ xargs สำหรับชื่อไฟล์ที่มีช่องว่างและอ็อพชัน -r เป็น rm สำหรับไดเร็กทอรีที่เพิ่มเข้ามา: svn status | grep ^ \? | ตัด -c9- | xargs -d \\ n rm -r
Seth Reno

4
ฉันยังมีปัญหากับตัวเลือก -d ที่ทำงานบน OS X ทางเลือกของฉันมีดังนี้ซึ่งแปลการแบ่งบรรทัดเป็นอักขระว่างและใช้ตัวเลือก -0 บน xargs เพื่อจัดการช่องว่างในชื่อไฟล์: สถานะ svn | grep ^ \? | ตัด -c9- | tr '\ n' '\ 0' | xargs -0 rm
Brian Webster

3
หากคุณขมวดคิ้วตามคำสั่งที่ขึ้นอยู่กับจำนวนอักขระที่แน่นอนในผลลัพธ์ของคำสั่งอื่น:svn status | grep "^?" | awk '{print $2}' | xargs -d \\n rm -r
Michael Schlottke-Lakemper

3
@Pavel ดูตัวเลือก xargs --no-run-if-empty
Ken

71

ฉันวิ่งผ่านหน้านี้ในขณะที่ต้องการทำสิ่งเดียวกันแม้ว่าจะไม่ใช่สำหรับบิลด์อัตโนมัติ

หลังจากค้นหาอีกเล็กน้อยฉันก็ค้นพบ ' Extended Context Menu ' ใน TortoiseSVN กดปุ่ม shift ค้างไว้แล้วคลิกขวาที่สำเนาที่ใช้งานได้ ขณะนี้มีตัวเลือกเพิ่มเติมภายใต้เมนู TortoiseSVN ซึ่งรวมถึง ' ลบรายการที่ไม่ได้เวอร์ชัน ... '

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


เยี่ยมมาก! ใน XP จะใช้งานได้เฉพาะในมุมมองรายการ (ด้านขวาของ explorer) ไม่ได้อยู่ในมุมมองแบบต้นไม้ (ด้านซ้าย)
Christopher Oezbek

ยอดเยี่ยมเพียงส่งไปที่ถังรีไซเคิลจะเป็นการดีที่จะลบตรง สิ่งที่ฉันต้องการ
Dean Thomas

คุณยังสามารถทำสิ่งนี้โดยอัตโนมัติในบรรทัดคำสั่งด้วย TortoiseProc.exe ของ TortoiseSVN: รายละเอียดในคำตอบของฉันด้านล่าง
stevek_mcc


9

หากคุณใช้บรรทัดคำสั่งของ windows

for /f "tokens=2*" %i in ('svn status ^| find "?"') do del %i

เวอร์ชันปรับปรุง:

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

หากคุณใช้สิ่งนี้ในไฟล์แบตช์คุณต้องเพิ่มเป็นสองเท่า%:

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

1
แบบนี้ใช้ได้ผลสำหรับฉัน ดูเหมือนว่าจะสำลักโฟลเดอร์ที่ไม่ได้เวอร์ชัน
jpierson

7

ฉันเพิ่มสิ่งนี้ในโปรไฟล์ windows powershell ของฉัน

function svnclean {
    svn status | foreach { if($_.StartsWith("?")) { Remove-Item $_.substring(8) -Verbose } }
}

2
@FelipeAlvarez ค่ะ ใช่พวกเราทำ. ไม่ใช่สิ่งที่ดีที่สุดตั้งแต่ขนมปังหั่นบาง ๆ ฉันจะบอกว่าอย่างน้อยก็มีประโยชน์พอ ๆ กับ bash อาจจะมากกว่านั้นเล็กน้อยเนื่องจากคุณสามารถดึงแอสเซมบลี. NET
jpmc26

มันทนทุกข์ทรมานจากแนวโน้มที่น่ารังเกียจของไมโครซอฟท์ต่อความฟุ่มเฟื่อย (ไม่ใช่แค่ในความยาวของชื่อคำสั่ง แต่โดยรวมแล้วเป็นไปไม่ได้ที่จะทำอะไรก็ได้โดยไม่ต้องคัดลอกตัวอย่างข้อมูลขนาดใหญ่จากอินเทอร์เน็ต) แต่มันมีประโยชน์อย่างน่าตกใจและค่อนข้างผ่านการไตร่ตรองมาอย่างดี
Warren P

1
คุณอาจต้องการที่จะเพิ่ม--no-ignoreไปsvn statusและ-RecurseไปRemove-Item
เควินเบิร์น

5

บรรทัดคำสั่ง Linux:

svn status --no-ignore | egrep '^[?I]' | cut -c9- | xargs -d \\n rm -r

หรือหากไฟล์บางไฟล์ของคุณเป็นของ root:

svn status --no-ignore | egrep '^[?I]' | cut -c9- | sudo xargs -d \\n rm -r

นี่เป็นไปตามคำตอบของเคน (คำตอบของเคนข้ามไฟล์ที่ไม่สนใจคำตอบของฉันลบออก)


5

เพียงแค่ทำบน unix-shell ด้วย:

rm -rf `svn st . | grep "^?" | cut -f2-9 -d' '`

วิธีนี้จะใช้ไม่ได้หากจำนวนไฟล์ที่จะลบเกินจำนวนอาร์กิวเมนต์บรรทัดคำสั่งสูงสุด ดูคำตอบตาม xargs ด้วย
maxschlepzig

4

คุณไม่สามารถส่งออกไปยังสถานที่ใหม่และสร้างจากที่นั่นได้หรือไม่?


1
สำหรับการสร้างอัตโนมัติฉันต้องการส่งออกที่สะอาด
ก.

1
ตามหลักการแล้วคุณควรทำเช่นนี้ แต่จะเป็นปัญหาหากการชำระเงินของคุณมีขนาดใหญ่มาก นั่นอาจเป็นเหตุผลที่ OP ถาม: เพื่อให้งานสร้างสั้นลง
jpmc26

4

หากคุณมีTortoiseSVNบนเส้นทางของคุณและคุณอยู่ในไดเรกทอรีที่ถูกต้อง:

TortoiseProc.exe /command:cleanup /path:"%CD%" /delunversioned /delignored /nodlg /noui

ตัวเลือกต่างๆได้อธิบายไว้ในวิธีใช้ TortoiseSVN สำหรับ/command:cleanup:

ใช้ / noui เพื่อป้องกันไม่ให้กล่องโต้ตอบผลลัพธ์โผล่ขึ้นมาทั้งที่บอกเกี่ยวกับการล้างข้อมูลเสร็จสิ้นหรือแสดงข้อความแสดงข้อผิดพลาด) / noprogressui ปิดใช้งานกล่องโต้ตอบความคืบหน้าด้วย / nodlg ปิดใช้งานการแสดงกล่องโต้ตอบการล้างข้อมูลซึ่งผู้ใช้สามารถเลือกสิ่งที่ควรทำในการล้างข้อมูล การดำเนินการที่มีสามารถระบุได้ด้วยอ็อพชัน / การล้างข้อมูลสำหรับการล้างสถานะ, / ย้อนกลับ, / delunversioned, / delignored, / refreshshell และ / externals


4

หากคุณใช้เต่า svn มีคำสั่งที่ซ่อนอยู่เพื่อทำสิ่งนี้ กด shift ค้างไว้ขณะคลิกขวาที่โฟลเดอร์เพื่อเปิดเมนูบริบทใน windows explorer คุณจะได้รับคำสั่ง "Delete Unversioned Items"

ดูรายละเอียดที่ด้านล่างของหน้านี้หรือภาพหน้าจอด้านล่างซึ่งไฮไลต์คุณสมบัติเพิ่มเติมที่มีดาวสีเขียวและรูปสี่เหลี่ยมสีเหลืองที่น่าสนใจ ...

SVN เมนูบริบทเพิ่มเติมเทียบกับเมนูมาตรฐาน



3

การแปลง C # ของฉันของสคริปต์ Thomas Watnedals Python:

Console.WriteLine("SVN cleaning directory {0}", directory);

Directory.SetCurrentDirectory(directory);

var psi = new ProcessStartInfo("svn.exe", "status --non-interactive");
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.WorkingDirectory = directory;

using (var process = Process.Start(psi))
{
    string line = process.StandardOutput.ReadLine();
    while (line != null)
    {
        if (line.Length > 7)
        {
            if (line[0] == '?')
            {
                string relativePath = line.Substring(7);
                Console.WriteLine(relativePath);

                string path = Path.Combine(directory, relativePath);
                if (Directory.Exists(path))
                {
                    Directory.Delete(path, true);
                }
                else if (File.Exists(path))
                {
                    File.Delete(path);
                }
            }
        }
        line = process.StandardOutput.ReadLine();
    }
}

ฉันอยากจะย้ายไฟล์ที่ไม่ได้แปลงในกรณีที่คุณต้องการมันในภายหลัง
leppie

แน่นอนว่าในเครื่องพัฒนา - แต่ใน build VMware นั้นจะไม่สมเหตุสมผลเลยเพราะไม่มีใครเข้าสู่ระบบและสร้างไฟล์
Stefan Schultze

ขอบคุณฉันใช้สิ่งนี้เป็นส่วนหนึ่งของสคริปต์ MSBuild ของฉันใน cruisecontrol เพื่อล้างข้อมูลต้นทางของฉันก่อนสร้าง
gregmac

เริ่มต้นโดยอิงตามรหัสของคุณและไปอีกหลายวิธี: github.com/tgmayfield/svn-clean-sharp/downloads
Tom Mayfield

3
svn st --no-ignore  | grep '^[?I]' | sed 's/^[?I]  *//' | xargs -r -d '\n' rm -r

นี่คือคำสั่ง unix shell เพื่อลบไฟล์ทั้งหมดที่ไม่อยู่ภายใต้การควบคุมการโค่นล้ม

หมายเหตุ:

  • stในsvn stเป็นสร้างในนามแฝงสำหรับstatusเช่นคำสั่งเทียบเท่ากับsvn status
  • --no-ignoreยังรวมถึงไฟล์ที่ไม่ใช่ที่เก็บในเอาต์พุตสถานะมิฉะนั้นจะละเว้นผ่านกลไกเช่น.cvsignoreอื่น ๆ - เนื่องจากเป้าหมายคือการมีจุดเริ่มต้นที่สะอาดสำหรับการสร้างสวิตช์นี้จึงเป็นสิ่งที่จำเป็น
  • grepฟิลเตอร์ที่ส่งออกดังกล่าวว่ามีเพียงไฟล์ที่ไม่รู้จักที่จะโค่นล้มที่เหลือ - เส้นเริ่มต้นด้วย?ไฟล์รายการที่ไม่รู้จักที่จะโค่นล้มที่จะถูกละเลยโดยไม่มี--no-ignoreตัวเลือก
  • คำนำหน้าถึงชื่อไฟล์จะถูกลบผ่าน sed
  • xargsคำสั่งมีคำสั่งผ่านทาง-rที่จะได้ดำเนินการrmเมื่อรายการอาร์กิวเมนต์จะเป็นที่ว่างเปล่า
  • -d '\n'ตัวเลือกที่จะบอกxargsจะใช้ขึ้นบรรทัดใหม่เป็นตัวคั่นคำสั่งดังกล่าวยังทำงานสำหรับชื่อไฟล์ที่มีช่องว่าง
  • rm -r ใช้ในกรณีที่ไดเร็กทอรีที่สมบูรณ์ (ซึ่งไม่ใช่ส่วนหนึ่งของที่เก็บ) จำเป็นต้องลบออก

2

ฉันไม่สามารถทำงานใด ๆ ข้างต้นได้หากไม่มีการอ้างอิงเพิ่มเติมฉันไม่ต้องการเพิ่มลงในระบบบิลด์อัตโนมัติของฉันบน win32 ดังนั้นฉันจึงรวบรวมคำสั่ง Ant ต่อไปนี้ - โปรดทราบว่าสิ่งเหล่านี้ต้องการ Ant-Contrib JAR เพื่อติดตั้ง (ฉันใช้เวอร์ชัน 1.0b3 ซึ่งเป็นเวอร์ชันล่าสุดกับ Ant 1.7.0)

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

  <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
  <taskdef name="for" classname="net.sf.antcontrib.logic.ForTask" />

  <macrodef name="svnExecToProperty">
    <attribute name="params" />
    <attribute name="outputProperty" />
    <sequential>
      <echo message="Executing Subversion command:" />
      <echo message="  svn @{params}" />
      <exec executable="cmd.exe" failonerror="true"
            outputproperty="@{outputProperty}">
        <arg line="/c svn @{params}" />
      </exec>
    </sequential>
  </macrodef>

  <!-- Deletes all unversioned files without warning from the 
       basedir and all subfolders -->
  <target name="!deleteAllUnversionedFiles">
    <svnExecToProperty params="status &quot;${basedir}&quot;" 
                       outputProperty="status" />
    <echo message="Deleting any unversioned files:" />
    <for list="${status}" param="p" delimiter="&#x0a;" trim="true">
      <sequential>
        <if>
          <matches pattern="\?\s+.*" string="@{p}" />
          <then>
            <propertyregex property="f" override="true" input="@{p}" 
                           regexp="\?\s+(.*)" select="\1" />
            <delete file="${f}" failonerror="true" />
          </then>
        </if>
      </sequential>
    </for>
    <echo message="Done." />
  </target>

สำหรับโฟลเดอร์อื่นให้เปลี่ยนการ${basedir}อ้างอิง


1
หมายเหตุ: ลบเฉพาะไฟล์ที่ไม่ได้เวอร์ชัน ไม่ลบโฟลเดอร์ว่างเปล่าที่ไม่ได้เวอร์ชัน

2
svn status --no-ignore | awk '/^[I\?]/ {system("echo rm -r " $2)}'

ลบเสียงสะท้อนหากแน่ใจว่าคุณต้องการทำอะไร


1
สิ่งนี้ด้อยกว่าคำตอบที่ใช้ xargs เนื่องจากสำหรับ n ที่จะถูกลบไฟล์จะมีกระบวนการ/bin/shn และ n ที่rmแยกออกจากกัน
maxschlepzig

เห็นด้วย ขอบคุณสำหรับข้อมูล xargs
Aria


1

อาจมีส่วนช่วยอีกทางเลือกหนึ่งเช่นกัน

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

/(config|.ini)/ มีไว้เพื่อวัตถุประสงค์ของฉันเอง

และอาจเป็นความคิดที่ดีที่จะเพิ่ม --no-ignored ในคำสั่ง svn



1

โซลูชัน cmd / bat ของ windows บริสุทธิ์:

@echo off

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
if "%1"=="%~nx0" goto :eof
IF EXIST "%1\*" ( 
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof

จริงๆแล้วสคริปต์นี้ไม่ได้ลบไฟล์ของฉัน อาจเกิดจากช่องว่างในนั้น คำตอบหนึ่งบรรทัดโดย @SukeshNambiar ได้ผล
Christiaan Westerbeek

1

ฉันได้ลองใช้เวอร์ชันของ Seth Renoจากคำตอบนี้แต่ไม่ได้ผลสำหรับฉัน ฉันมีอักขระ 8 ตัวก่อนหน้าชื่อไฟล์ไม่ใช่ 9 ตัวที่ใช้ในcut -c9-.

นี่คือเวอร์ชันของฉันsedแทนที่จะเป็นcut:

svn status | grep ^\? | sed -e 's/\?\s*//g' | xargs -d \\n rm -r

1

หากคุณเจ๋งกับ powershell:

svn status --no-ignore | ?{$_.SubString(0,1).Equals("?")} | foreach { remove-item -Path (join-Path .\ $_.Replace("?","").Trim()) -WhatIf }

นำแฟล็ก -WhatIf ออกเพื่อให้คำสั่งดำเนินการลบจริง มิฉะนั้นมันจะส่งออกสิ่งที่จะทำหากรันโดยไม่มี -WhatIf


1

ฉันจะเพิ่มสิ่งนี้เป็นความคิดเห็นในคำตอบของ Thomas Watnedalแต่ยังทำไม่ได้

ปัญหาเล็กน้อยกับมัน (ซึ่งจะไม่มีผลกับ Windows) คือมันจะตรวจสอบเฉพาะไฟล์หรือไดเร็กทอรีเท่านั้น สำหรับระบบ Unix like ที่อาจมีลิงก์สัญลักษณ์จำเป็นต้องเปลี่ยนบรรทัด:

if os.path.isfile(fullpath):

ถึง

if os.path.isfile(fullpath) or os.path.islink(fullpath):

เพื่อลบลิงก์

สำหรับฉันการเปลี่ยนบรรทัดสุดท้ายif match: removeall(match.group(1))เป็น

    if match:
        print "Removing " + match.group(1)
        removeall(match.group(1))

เพื่อให้แสดงสิ่งที่กำลังลบก็มีประโยชน์เช่นกัน

ทั้งนี้ขึ้นอยู่กับกรณีการใช้งานที่?[\?ID]เป็นส่วนหนึ่งของการแสดงออกปกติอาจจะดีกว่าที่เป็น?[\?I]เป็นDไฟล์ยังลบลบซึ่งอยู่ภายใต้การควบคุมเวอร์ชัน ฉันต้องการใช้สิ่งนี้เพื่อสร้างในโฟลเดอร์ที่สะอาดและตรวจสอบในโฟลเดอร์ดังนั้นจึงไม่ควรมีไฟล์อยู่ในDสถานะ


1

@zhoufei ฉันทดสอบคำตอบของคุณและนี่คือเวอร์ชันอัปเดต:

FOR /F "tokens=1* delims= " %%G IN ('svn st %~1 ^| findstr "^?"') DO del /s /f /q "%%H"
FOR /F "tokens=1* delims= " %%G IN ('svn st %~1 ^| findstr "^?"') DO rd /s /q "%%H"
  • คุณต้องใช้%เครื่องหมายสองตัวหน้า G และ H
  • สลับลำดับ: ก่อนอื่นให้ลบไฟล์ทั้งหมดจากนั้นลบไดเรกทอรีทั้งหมด
  • (ไม่บังคับ :) ในการ%~1ใช้ชื่อไดเร็กทอรีใดก็ได้ฉันใช้สิ่งนี้เป็นฟังก์ชันในไฟล์ bat ดังนั้น%~1พารามิเตอร์อินพุตแรกจึงเป็น

0

หากคุณไม่ต้องการเขียนโค้ดใด ๆ svn2.exe จากsvn2svnก็ทำเช่นนี้นอกจากนี้ยังมีบทความเกี่ยวกับวิธีการใช้งาน โฟลเดอร์และไฟล์ที่ถูกลบจะใส่ในถังรีไซเคิล

เรียกใช้ "svn2.exe sync [path]"


0

สำหรับคนที่ชอบทำสิ่งนี้ด้วย perl แทนที่จะเป็น python, Unix shell, java และอื่น ๆ นี่คือสคริปต์ perl ขนาดเล็กที่ทำ jib เช่นกัน

หมายเหตุ: นอกจากนี้ยังลบไดเรกทอรีที่ไม่ได้เวอร์ชันทั้งหมด

#!perl

use strict;

sub main()

{

    my @unversioned_list = `svn status`;

    foreach my $line (@unversioned_list)

    {

        chomp($line);

        #print "STAT: $line\n";

        if ($line =~/^\?\s*(.*)$/)

        {

            #print "Must remove $1\n";

            unlink($1);

            rmdir($1);

        }

    }

}

main();

0

การใช้ TortoiseSVN: * คลิกขวาที่โฟลเดอร์สำเนาที่ใช้งานได้ในขณะที่กดปุ่ม shift ค้างไว้ * เลือก "ลบรายการที่ไม่ได้เวอร์ชัน"

ฉันจะลบไฟล์ / โฟลเดอร์ที่ไม่ได้เวอร์ชัน / ละเว้นทั้งหมดในสำเนาที่ใช้งานได้อย่างไร


0

วิธีที่สะอาดใน PERL คือ:

#!/usr/bin/perl
use IO::CaptureOutput 'capture_exec'

my $command = sprintf ("svn status --no-ignore | grep '^?' | sed -n 's/^\?//p'");

my ( $stdout, $stderr, $success, $exit_code ) = capture_exec ( $command );
my @listOfFiles = split ( ' ', $stdout );

foreach my $file ( @listOfFiles )
{ # foreach ()
    $command = sprintf ("rm -rf %s", $file);
    ( $stdout, $stderr, $success, $exit_code ) = capture_exec ( $command );
} # foreach ()

0

ฉันใช้เวลาประมาณ 3 ชั่วโมงในการสร้างสิ่งนี้ จะใช้เวลา 5 นาทีในการทำใน Unix ปัญหาหลักคือช่องว่างในชื่อสำหรับโฟลเดอร์ Win ไม่สามารถแก้ไข %% i และปัญหาในการกำหนด vars ใน Win cmd loop

setlocal enabledelayedexpansion

for /f "skip=1 tokens=2* delims==" %%i in ('svn status --no-ignore --xml ^| findstr /r "path"') do (
@set j=%%i
@rd /s /q !j:~0,-1!
)

0

รหัส C # ด้านบนใช้ไม่ได้สำหรับฉัน - ฉันมีไคลเอนต์เต่า svn และรูปแบบบรรทัดต่างกันเล็กน้อย นี่คือรหัส snipet เดียวกับด้านบนเขียนใหม่เฉพาะเพื่อใช้งานและใช้ regex

        /// <summary>
    /// Cleans up svn folder by removing non committed files and folders.
    /// </summary>
    void CleanSvnFolder( string folder )
    {
        Directory.SetCurrentDirectory(folder);

        var psi = new ProcessStartInfo("svn.exe", "status --non-interactive");
        psi.UseShellExecute = false;
        psi.RedirectStandardOutput = true;
        psi.WorkingDirectory = folder;
        psi.CreateNoWindow = true;

        using (var process = Process.Start(psi))
        {
            string line = process.StandardOutput.ReadLine();
            while (line != null)
            {
                var m = Regex.Match(line, "\\? +(.*)");

                if( m.Groups.Count >= 2 )
                {
                    string relativePath = m.Groups[1].ToString();

                    string path = Path.Combine(folder, relativePath);
                    if (Directory.Exists(path))
                    {
                        Directory.Delete(path, true);
                    }
                    else if (File.Exists(path))
                    {
                        File.Delete(path);
                    }
                }
                line = process.StandardOutput.ReadLine();
            }
        }
    } //CleanSvnFolder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.