मैं SVN में सभी असंबद्ध फ़ाइलों को 'svn' कैसे जोड़ूँ?


177

मैं अपने SVN रिपॉजिटरी के लिए एक काम करने वाली कॉपी में सभी गैर-पंजीकृत फ़ाइलों को स्वचालित रूप से 'svn add' करने का एक अच्छा तरीका ढूंढ रहा हूं।

मेरे पास एक लाइव सर्वर है जो कुछ फाइलें बना सकता है जो स्रोत नियंत्रण में होनी चाहिए। मैं एक छोटी स्क्रिप्ट रखना चाहूंगा जिसे मैं एक बार में एक साथ जोड़ने और उन्हें जोड़ने के बजाय स्वचालित रूप से इनको जोड़ने के लिए चला सकूं।

मेरा सर्वर Windows Server 2003 चला रहा है इसलिए एक यूनिक्स समाधान काम नहीं करेगा।


1
@ सॉल यह प्रश्न आपके द्वारा लिंक किए गए व्यक्ति से स्पष्ट रूप से संबंधित है, इसलिए मैं यह नहीं देखता कि यह डुप्लिकेट कैसे हो सकता है। अगर कुछ भी अन्य प्रश्न डुप्लिकेट है।
न्यूट्रिनो

Cygwin एक विकल्प है। आपको किसी भी विंडो वातावरण पर बैश की शक्ति देता है। बहुत छोटी समस्याओं के साथ 10 वर्षों के लिए एक उपयोगकर्ता बन गया।
user151841

जवाबों:


346

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

महान टिप! एक टिप्पणी: मेरा ग्रहण स्वतः ही अनदेखी सूची में नई फाइलें जोड़ता है। यह विन्यास की बात हो सकती है, लेकिन किसी भी तरह: --no-ignoreविकल्प है जो मदद करता है।

इसके बाद, आप यह कर सकते हैं:

svn commit -m 'Adding a file'

14
महान टिप। Svn स्थिति का उपयोग करने से बहुत बेहतर है। "svn add --force" पर्याप्त लगता है।
नाम

1
वहाँ एक आसान तरीका यह एक छोटा मैक्रो को सेट करने के लिए है (यानी, जैसा कि आप गिट के साथ कर सकते हैं)? इसके अलावा, क्या इस उत्तर को अपडेट करना संभव होगा ताकि यह प्रत्येक बिट को समझाए?
मृदुक

2
@ मृदुक: लघु: alias magic="svn add --force * --auto-props --parents --depth infinity -q"- समझाया गया:svn help add
रोनेन

17
समस्या यह है कि अनदेखा फ़ाइलों को सही जोड़ता है? वांछनीय नहीं है।
लडियू

1
@ नाम - आपको *अंत में डालने की ज़रूरत है , अन्यथा यह काम नहीं करेगा (मेरे लिए पट्टे पर)
vsync

72

यह मेरे लिए एक अलग सवाल है, लेकिन वहाँ एक जवाब है कि इस सवाल पर संबंधित है:

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

8
यह UNIX टूल (grep, sed, bash) का उपयोग करता है जो ओपी ने कहा था कि उसके पास नहीं है।
नाफ्फ

3
अगर आप वास्तव में चाहते हैं तो आप शायद खिड़कियों पर सेड और क्रेप भी खोद सकते हैं।
सैम केसर

1
उस साइबर क्षमा टिप्पणी के लिए खेद, जानबूझकर नहीं था (और मैं इसे पूर्ववत नहीं कर सकता)। वास्तव में मुझे लगता है कि साइबरविन उतनी ही बदसूरत है जितना आप विंडोज पर पा सकते हैं। आप अभी भी grep के बजाय खोज का उपयोग कर सकते हैं जो कम से कम विंडोज 2000 के बाद से कुछ भी अतिरिक्त स्थापित किए बिना काम करेगा।
जॉय


2
मैं mbyrne215 के साथ हूं; इस जवाब ने मुझे ओपी के समाधान से अधिक मदद की, इसलिए मैं इसे वोट कर रहा हूं। OS X 10.6.7 में पूरी तरह से काम करता है।
असबजर्न उल्सबर्ग

37

यह क्या काम करता है:

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

उपनिर्देशिका की सामग्री जोड़ता है।

उपेक्षित फ़ाइलों को नहीं जोड़ता है।

सूचीबद्ध करता है कि कौन सी फाइलें जोड़ी गईं।

कमांड में डॉट वर्तमान निर्देशिका को इंगित करता है, यह एक विशिष्ट निर्देशिका नाम या पथ द्वारा प्रतिस्थापित किया जा सकता है यदि आप वर्तमान से अलग निर्देशिका जोड़ना चाहते हैं।


वास्तव में यह होना चाहिए .\*या अगर svn जड़ एक अलग dir पर है stuff\svn_root\*
नक्स

मैं अनुसरण नहीं करता। एसवीएन को कमांड उस पथ के संदर्भ में निष्पादित करते हैं जहां से वे निष्पादित किए जाते हैं, यह उम्मीद की जानी है। "svn add। \ *" अकेले पुनरावृत्ति नहीं करता है और चेतावनी स्पैम के एक लोड को प्रिंट करता है जिससे यह देखना असंभव है कि वास्तव में क्या जोड़ा गया था। "svn add। \ * --force" पुनरावृत्ति करता है, लेकिन यह भी प्रिंट करता है "svn: स्किपिंग तर्क: E225: '। \ _ svn एक आरक्षित नाम में समाप्त होता है"। तो यह मेरे मूल समाधान से भी बदतर लगता है।
न्यूट्रिनो

मैं इंगित कर रहा था कि शायद आपके पास एसवीएन ;-) पर पूरी सी ड्राइव नहीं है, और इसलिए आपको एक रास्ता जोड़ना चाहिए। और मेरे परीक्षण से पथ निर्दिष्ट करने के रूप stuff\svn_rootमें उप निर्देशिका (जैसे stuff\svn_root\already_in_svn\not_in_svn.txt) में फ़ाइलों को नहीं जोड़ता है । इसलिए अंत में स्टार।
नक्स

@ अब केवल इन सभी वर्षों के बाद मैं अंत में देखता हूं कि आपको क्या मिल रहा था :) कमांड में डॉट वह पथ है जो वर्तमान निर्देशिका को निर्दिष्ट करता है। स्वाभाविक रूप से इसके बजाय किसी भी वैध विकल्प की आपूर्ति की जा सकती है।
न्यूट्रिनो

यह सही जवाब है। मुझे यकीन नहीं है कि कैसे एक समाधान जिसमें अनदेखा फ़ाइलों को शामिल करना शीर्ष स्थान है। @ न्यूट्रीनो, अपनी टिप्पणी को joey पर हटाने का सुझाव दें, जो अब इस पृष्ठ पर दिखाई नहीं देती है, और यह भी एक लाइन जोड़ दें कि आपका सुझाव अनदेखा फ़ाइलों को नहीं जोड़ता है
b_levitt

35

यह मेरे लिए काम किया:

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

( स्रोत )

जैसा कि आपने विंडोज के लिए अपनी समस्या पहले ही हल कर ली है, यह एक यूनिक्स समाधान (सैम के बाद) है। मैंने यहां जोड़ा क्योंकि मुझे लगता है कि यह अभी भी उन लोगों के लिए उपयोगी है, जो इस प्रश्न को एक ही चीज़ के लिए पूछते हैं (जैसा कि शीर्षक में "WINDOWS" कीवर्ड शामिल नहीं है)।

नोट (फ़रवरी, 2015): जैसा कि "bdrx" द्वारा टिप्पणी की गई है, उपरोक्त आदेश को इस तरह से और सरल बनाया जा सकता है:

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

1
अच्छा, कॉम्पैक्ट, संक्षिप्त, भी काफी विस्तार करने के लिए खुद को उधार देता है। धन्यवाद।
नॉर्मन एच

1
महान। इसके अलावा विस्तार करने में आसान, हटाने के लिए संशोधित आदि
Drewid

मैं क्या जरूरत के लिए बिल्कुल सही। धन्यवाद!
जेफ

2
लोग हमेशा जागते हैं और फिर जागने के लिए पाइप क्यों बनाते हैं? Awk पैटर्न मिलान कर सकते हैं awk '/^[?]/{print $2}':; अतिरिक्त grep प्रक्रिया के लिए कोई ज़रूरत नहीं है।
bdrx

1
@bdrx: शायद इसलिए कि grep आमतौर पर पैटर्न से मेल खाता है? मेरे व्यक्तिगत मामले में, मैं जाग के साथ grep के साथ बहुत अधिक अनुभवी हूं। मुझे इस बात की जानकारी नहीं थी कि आप ऐसी चीजों को जागृत कर सकते हैं, इसलिए मैं अपनी लिपियों में awk का अधिक उपयोग करना शुरू करूँगा। धन्यवाद!
लेप

5
svn add --force .

यह वर्तमान निर्देशिका और सभी संस्करणित बाल निर्देशिकाओं में किसी भी फ़ाइल को नहीं जोड़ा जाएगा।


5

इस विधि को उन फ़ाइलनामों को संभालना चाहिए जिनके पास रिक्त स्थान की कोई संख्या / संयोजन है ...

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

यहाँ वह क्या करता है, इसका विवरण दिया गया है:

  • सभी परिवर्तित फ़ाइलों की सूची दें।
  • इस सूची को '?' की पंक्तियों तक सीमित करें। शुरुआत में - यानी नई फाइलें।
  • हटाए '?' लाइन की शुरुआत में चरित्र।
  • पंक्ति की शुरुआत में रिक्त स्थान निकालें।
  • कई बार svn जोड़ने के लिए xargs में फ़ाइल नाम पाइप।

'Svn ऐड' में रिक्त स्थान के साथ फ़ाइलों के नाम आयात करने में सक्षम होने के लिए xargs के लिए -i तर्क का उपयोग करें - मूल रूप से -i सेट {} को एक प्लेसहोल्डर के रूप में इस्तेमाल किया जा सकता है ताकि हम "svn द्वारा उपयोग किए गए फ़ाइल नाम के चारों ओर" वर्ण डाल सकें। 'जोड़ें।

इस पद्धति का एक फायदा यह है कि यह उन में रिक्त स्थान के साथ फ़ाइल नाम को संभालना चाहिए।


यह लिनक्स या इसी तरह के (उदाहरण के लिए MinGW या Cygwin ) माना जाता है । ओपी ने कहा: "मेरा सर्वर विंडोज सर्वर 2003 चला रहा है इसलिए यूनिक्स समाधान काम नहीं करेगा।"
पीटर मॉर्टेंसन

4

यदि आप एक गैर-कमांड-लाइन समाधान का उपयोग करने के लिए तैयार हैं, तो TortoiseSVN में यह क्षमता है। बस शीर्ष स्तर के फ़ोल्डर पर राइट क्लिक करें और जोड़ें चुनें ...


विशाल भंडार के साथ TortoiseSVN हैंग हो जाता है। इससे मुझे कमांड लाइन के विकल्प की तलाश हुई :-)
उपेंद्र


3

उपयोग:

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

1
या आप grep की नौकरी करने के लिए कट का उपयोग कर सकते हैं: svn status | cut -d ? -f 2 -s | xargs svn add
Eric3

यह लिनक्स या इसी तरह के (उदाहरण के लिए MinGW या Cygwin ) माना जाता है । ओपी ने कहा: "मेरा सर्वर विंडोज सर्वर 2003 चला रहा है इसलिए यूनिक्स समाधान काम नहीं करेगा।"
पीटर मोर्टेंसन

3

मैं हमेशा उपयोग करता हूं:

कॉपी पेस्ट

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

1
ऑप एक्सप्लिसिटी में कहा गया है कि यूनिक्स समाधान उसके लिए कोई उपयोग नहीं है।
न्यूट्रिनो

यह लिनक्स या इसी तरह के (उदाहरण के लिए MinGW या Cygwin ) माना जाता है । ओपी ने कहा: "मेरा सर्वर विंडोज सर्वर 2003 चला रहा है इसलिए यूनिक्स समाधान काम नहीं करेगा।"
पीटर मॉर्टेंसन

3

चूँकि यह पोस्ट विंडोज टैग की गई है, मुझे लगा कि मैं विंडोज के लिए एक समाधान निकालूंगा। मैं इस प्रक्रिया को स्वचालित करना चाहता था, और मैंने एक बैट फाइल बनाई। मैंने C # में एक कंसोल ..exe बनाने का विरोध किया।

मैं कोई भी फाइल या फोल्डर जोड़ना चाहता था, जो मेरे द्वारा रिपॉजिटरी में नहीं जोड़ा जाता है जब मैं कमिट प्रक्रिया शुरू करता हूं।

कई जवाबों के साथ समस्या यह है कि वे अनवांटेड फ़ाइलों को सूचीबद्ध करेंगे जिन्हें TortoiseSVN में मेरी अनदेखी सूची के अनुसार अनदेखा किया जाना चाहिए ।

यहाँ मेरी हुक सेटिंग और बैच फ़ाइल है जो ऐसा करती है

कछुआ हुक स्क्रिप्ट:

"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

यदि आप लिनक्स का उपयोग करते हैं या खिड़कियों में Cygwin या MinGW का उपयोग करते हैं, तो आप निम्नलिखित जैसे बैश जैसे समाधानों का उपयोग कर सकते हैं। यहां प्रस्तुत अन्य समान लोगों के साथ विरोधाभास, यह एक फ़ाइल नाम स्थान को ध्यान में रखता है:

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

यह किस लिए है? अध्यक्ष एवं प्रबंध निदेशक? दे घुमा के? यह बैश (या एक समान शेल) जैसा दिखता है। उस स्थिति में, यह लिनक्स या समान (उदाहरण के लिए MinGW या Cygwin ) को ग्रहण करता है । ओपी ने कहा: "मेरा सर्वर विंडोज सर्वर 2003 चला रहा है इसलिए यूनिक्स समाधान काम नहीं करेगा।"
पीटर मोर्टेंसन

धन्यवाद, आप सही हैं, जब मैं विंडोज में हूं तो मैं बैश के साथ सिगविन का उपयोग करता हूं। हालाँकि कथन "मेरा सर्वर Windows Server 2003 चला रहा है इसलिए एक यूनिक्स समाधान काम नहीं करेगा।" गलत है। शायद वह Cygwin या MinGW का उपयोग नहीं करना चाहता, लेकिन उसने खुद को उस तरह से व्यक्त नहीं किया। मैंने प्रतिक्रिया में सुधार किया।
१०:११

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: इसका एक चर; यह एक बार में सूचीबद्ध फ़ाइलों में से प्रत्येक का मान ग्रहण करेगा; इसका एक और चरित्र-नाम हो सकता है।
  • IN: समझाने की जरूरत नहीं, है ना?
  • ('dir / s / b / a: d'): DOS कमांड जो निर्देशिकाओं को सूचीबद्ध करेगा; मेरे मामले में / पुनरावर्ती है, / b केवल पूर्ण पथ लेने के लिए है, / a: d का अर्थ केवल निर्देशिका है; जैसा कि आप कोष्ठक और apostrophes रखते हुए इसे बदलना।
  • DO: इसका मतलब है कि कमांड में आगे क्या आता है, जिसे प्रत्येक डायरेक्टरी के लिए निष्पादित किया जाएगा
  • svn add --depth = खाली: यह वांछित SVN कमांडो चलाया जाना है; डेप्थ डेफिनिशन का मतलब केवल डायरेक्टरी को जोड़ना है न कि उनके अंदर मौजूद फाइल्स को।
  • "% F": यह है कि आप पहले से परिभाषित चर का उपयोग कैसे करते हैं।

दूसरे कमांड में, केवल अंतर dir कमांड और svn कमांड हैं, मुझे लगता है कि यह पर्याप्त स्पष्ट है।


0

आप कमांड का उपयोग कर सकते हैं

svn add * force--

या

svn add <directory/file name>

यदि आपकी फ़ाइलें / निर्देशिका पुनरावर्ती नहीं जोड़ रहे हैं। फिर यह जाँच करें।

पुनरावर्ती जोड़ना डिफ़ॉल्ट संपत्ति है । आप SVN पुस्तक में देख सकते हैं ।

मुद्दा आपकी अनदेखी सूची या वैश्विक गुणों में हो सकता है।

मुझे समाधान Google समस्या ट्रैकर मिला

स्टार की अनदेखी करने के लिए वैश्विक गुणों की जाँच करें (*)

  • विंडो में अपने रेपो में राइट क्लिक करें। का चयन करें TortoiseSVN > Properties
  • देखें कि क्या आपके पास कोई संपत्ति नहीं है svn:global-ignores with a value of *
  • यदि आपके पास संपत्ति है star(*)तो यह पुनरावर्ती जोड़ने की उपेक्षा करेगा। इसलिए इस संपत्ति को हटाओ।

स्टार को अनदेखा करने के लिए वैश्विक उपेक्षा पैटर्न की जाँच करें (*)

  • विंडो में अपने रेपो में राइट क्लिक करें। का चयन करें TortoiseSVN > Settings > General
  • ग्लोबल इग्नोर पैटर्न में देखें, अगर आपके पास वहां स्टार (*) सेट नहीं है ।
  • यदि आपको मिला है star(*), तो इस संपत्ति को हटा दें।

इस लड़के ने यह भी बताया कि इस प्रॉपर्टी को मेरे प्रोजेक्ट में क्यों जोड़ा गया।

सबसे ज्यादा जिस तरह से यह मिला है वह यह है कि किसी ने बिना किसी एक्सटेंशन के किसी फ़ाइल को राइट-क्लिक किया और TortoiseSVN -> SVN पर ध्यान नहीं दिया -> * (पुनरावर्ती), और फिर यह प्रतिबद्ध है।

आप लॉग देख सकते हैं कि उस संपत्ति में किसने बदलाव किया है, यह पता करें कि वे वास्तव में क्या करने की कोशिश कर रहे थे, और उन्हें भविष्य में और अधिक सावधान रहने के लिए कहें। :)



0

चूंकि उसने विंडोज निर्दिष्ट किया था, जहां 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 पैच का इस्तेमाल कर सकें।


-1

मुझे लगता है कि मैंने कुछ ऐसा ही किया है:

svn add . --recursive

लेकिन यकीन नहीं होता कि मेरी याददाश्त सही है? - पी


2
आपकी स्मृति के लिए बस एक अद्यतन: svn 1.4 और 1.5 समर्थन नहीं करते हैं - svn जोड़ने के लिए पैरामीटर के रूप में संक्षिप्त करें :)
लुडविग वेनसॉयर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.