2010-10-15 16 views
56

में किसी निर्देशिका का नाम बदलने का एक सौहार्द तरीका वीसीएस (नियमित svn, git और git-svn उपयोगकर्ता) में किसी भी तरह से छिपा हुआ है, लेकिन मैं इस असाधारण एसवीएन व्यवहार के आसपास अपने सिर को लपेट नहीं सकता।सबवर्सन वर्किंग कॉपी

जब भी मैं एक अन्यथा 'साफ़' राज्य से मेरी SVN काम कर कॉपी में एक निर्देशिका का नाम बदलने की जरूरत है - यानी svn status रिटर्न कुछ भी नहीं है और सभी अन्य संशोधनों प्रतिबद्ध किया गया है - तो की तरह (जो क्या SVN डॉक पता चलता है):

svn mv foo bar 
svn commit 

SVN जोर से शिकायत:

Adding   bar 
Adding   bar/toto 
Deleting  foo 
svn: Commit failed (details follow): 
svn: Item '/test/foo' is out of date 

जैसा तुम चाहो:

svn update 

कौन देता है:

C foo 
At revision 46. 
Summary of conflicts: 
    Tree conflicts: 1 

एक पेड़ संघर्ष, नहीं है, जबकि तीसरे पक्ष परिवर्तन हुआ। काफी braindead

svn resolve --accept working -R . 
svn commit 

रेपो पर दूर से यह नाम बदल रहा है तो मेरे कार्य प्रतिलिपि को अद्यतन करने लगता है:: जाहिर है, इस पेड़ संघर्ष गंदगी से बाहर निकलने का एक ही तरीका है सामान्य रूप से (SVN लाल किताब से) है

url=$(svn info | grep -e '^URL:' | sed 's/^URL: //') svn mv $url/foo $url/bar 
svn update 

क्या एक फ़ोल्डर का नाम बदलने के लिए एक स्वीकृत, अधिक सुव्यवस्थित तरीका है जिसे मैं याद कर रहा हूं? उस विशेष रूप से आश्चर्यजनक वृक्ष संघर्ष राज्य के पीछे मूल कारण क्या है? मेरे लिए

+0

क्या आप सही वृक्ष संघर्ष संदेश पोस्ट कर सकते हैं? –

+0

मैंने इस व्यवहार को पहले भी देखा है, लेकिन मुझे यकीन नहीं है कि इसका कारण क्या है। क्या यह तब होता है जब आप एक डीआईआर जोड़ते हैं और संभवतः इसे पहले नामित करते हैं? –

+0

मैं भी इस व्यवहार का अनुभव करता हूं और एक कारण जानने में सक्षम नहीं हूं। मैंने हमेशा इसे "एसवीएन काम करने के तरीके" के लिए तैयार किया है। ये मुझे पागल कर रहा है। –

उत्तर

56

svn mv काम करता है:

C:\svn\co>svn mv my_dir new_dir 
A   new_dir 
D   my_dir\New Text Document.txt 
D   my_dir 


C:\svn\co>svn commit -m foo 
Raderar    my_dir 
Lägger till   new_dir 

Arkiverade revision 2. 

C:\svn\co> 

SVN के स्वीडिश उत्पादन के लिए खेद है।

आपके मामले में कुछ और गलत होना चाहिए।

संपादित करें:
रूप Lloeki

द्वारा टिप्पणी में कहा व्यवहार तुम भी अद्यतन करें और फ़ोल्डर में निहित एक फ़ाइल के लिए प्रतिबद्ध, लेकिन स्वयं फ़ोल्डर को अद्यतन नहीं करने की आवश्यकता है पुन: पेश करने के लिए।

फ़ाइल प्रतिबद्ध रेपो पर एक नया राजस्व n बनाता है, लेकिन स्थानीय मेटाडाटा को अद्यतन नहीं है (के रूप में यह हमेशा किया है, लॉग SVN किसी भी प्रतिबद्ध के बाद देखें), इस प्रकार dir मेटाडाटा राजस्व n- पर है 1। यह का पालन करता है कि svn मेटाडेटा diff के कारण प्रतिबद्ध नहीं होगा, और यह अपडेट नहीं करेगा क्योंकि वास्तव में पर एक संघर्ष है: अद्यतन मेटाडाटा बनाम हटाएं।

व्यवहार "अपेक्षित" है और "समाधान" svn rename आदेश जारी करने से पहले कार्यशील प्रति अद्यतन करना है।

+2

यह पता लगाना कि 'कुछ और' वास्तव में प्रश्न का हिस्सा है :) अब नया टेक्स्ट Document.txt संशोधित करें, इसे प्रतिबद्ध करें, फिर dv mv और फिर से प्रतिबद्ध करें। – Lloeki

+1

@Lloeki, हाँ पाठ फ़ाइल को संशोधित करके पेड़ संघर्ष को पुन: उत्पन्न करता है। यह वास्तव में मेरे लिए एक बग जैसा दिखता है, क्या आपने इश्यू ट्रैकर को http://subversion.apache.org/ पर खोजा है और/या वहां एक बग रिपोर्ट दायर की है? –

+2

मुझे अंततः कारण मिला, जो एक विचलित तरीके से समझ में आता है: फ़ाइल प्रतिबद्ध रेपो पर एक नया rev * n * बनाता है, लेकिन स्थानीय मेटाडाटा अपडेट नहीं होता है (जैसा कि यह हमेशा होता है, किसी भी प्रतिबद्धता के बाद 'svn log' देखें) , इस प्रकार डीआईआर मेटाडाटा rev * n-1 * पर है। यह इस प्रकार है कि मेटाडेटा diff की वजह से svn प्रतिबद्ध नहीं होगा, और यह अद्यतन नहीं होगा क्योंकि वास्तव में dir पर एक संघर्ष है: मेटाडेटा बनाम हटाएं। – Lloeki

0

कोई ऐसे परिदृश्य के बारे में सोच सकता है जहां निर्देशिका किसी अन्य उपयोगकर्ता द्वारा रिपॉजिटरी में बदल दी गई है। अपनी कार्यशील प्रतिलिपि में एक ही फ़ोल्डर का नाम बदलने से प्रतिबद्धता के दौरान पेड़ के संघर्ष ट्रिगर हो सकते हैं।

Resolving conflicts दिखाता है कि उपद्रव में 'पेड़ संघर्ष' को कैसे हल किया जाए।

+0

से सामान्य svn प्रतिबद्धता का उपयोग कर सकता हूं, मैं एक अकेले डेवलपर परिदृश्य में हूं जहां कोई बाहरी परिवर्तन नहीं होता है। – Lloeki

1

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

vi someotherfile 
...various changes to the other file 
svn mv olddir newdir 
svn commit -m"Moved olddir out of the way" olddir 
svn commit -m"New location of olddir" newdir 
svn update 
svn commit -m"Changed someotherfile" someotherfile 

मुझे लगता है वहाँ विभिन्न अन्य संभव तरीके दौर थे कि, और कहा कि वहाँ सुनिश्चित SVN mv भी ​​चाल किया होता करने से पहले एक साफ कार्यशील निर्देशिका था।

7

ठीक है, मैं इसमें शामिल हो गया - और अंततः एक साधारण टर्मिनल सत्र के साथ समस्या का पुनर्निर्माण कर सकता हूं: समस्या तब होती है जब आप svn mv (स्थानांतरित/नाम बदलें) फ़ाइल; फिर उस परिवर्तन को प्रतिबद्ध करें; तो (बिना कर एक svn update पहले), svn mv फ़ाइल की पेरेंट निर्देशिका जिसका चाल/नाम बदलने पहले से हामी भर दी थी - और अंत में निर्देशिका नाम परिवर्तन पर एक svn commit करते हैं - या accepted answer के रूप में यह कहते हैं: "आप भी जरूरत है फ़ोल्डर में निहित फ़ाइल को अद्यतन और प्रतिबद्ध करने के लिए, लेकिन फ़ोल्डर को अद्यतन नहीं करें "; लेकिन यह सब माता-पिता (या बल्कि, पूर्वजों) निर्देशिका में निष्पादित किया गया। यहाँ कमांड लाइन लॉग समस्या का प्रदर्शन है:

$ cd /tmp 
$ svnadmin create myrepo 
$ svn co file:///tmp/myrepo myrepo-wc 
Checked out revision 0. 

$ cd myrepo-wc/ 
$ mkdir -p dir1/dir2/dir3 
$ svn add dir1/ 
A   dir1 
A   dir1/dir2 
A   dir1/dir2/dir3 

$ svn ci -m 'add dir1/' 
Adding   dir1 
Adding   dir1/dir2 
Adding   dir1/dir2/dir3 

Committed revision 1. 

$ echo test1 >> dir1/dir2/dir3/test1.txt 
$ echo test2 >> dir1/dir2/dir3/test2.txt 
$ svn add dir1/ 
svn: warning: 'dir1' is already under version control 
$ svn add dir1/* 
svn: warning: 'dir1/dir2' is already under version control 
$ svn add dir1/dir2/dir3/* 
A   dir1/dir2/dir3/test1.txt 
A   dir1/dir2/dir3/test2.txt 
$ svn status 
A  dir1/dir2/dir3/test2.txt 
A  dir1/dir2/dir3/test1.txt 
$ svn ci -m 'add dir1/dir2/dir3/*' 
Adding   dir1/dir2/dir3/test1.txt 
Adding   dir1/dir2/dir3/test2.txt 
Transmitting file data .. 
Committed revision 2. 

$ svn mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt 
A   dir1/dir2/dir3/test2X.txt 
D   dir1/dir2/dir3/test2.txt 
$ svn status 
D  dir1/dir2/dir3/test2.txt 
A + dir1/dir2/dir3/test2X.txt 
$ svn ci -m 'mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt' 
Deleting  dir1/dir2/dir3/test2.txt 
Adding   dir1/dir2/dir3/test2X.txt 

Committed revision 3. 

$ svn status 
$ svn mv dir1/dir2/dir3 dir1/dir2/dir3X 
A   dir1/dir2/dir3X 
D   dir1/dir2/dir3/test2X.txt 
D   dir1/dir2/dir3/test1.txt 
D   dir1/dir2/dir3 
$ svn status 
D  dir1/dir2/dir3 
D  dir1/dir2/dir3/test2X.txt 
D  dir1/dir2/dir3/test1.txt 
A + dir1/dir2/dir3X 
D + dir1/dir2/dir3X/test2.txt 
$ svn ci -m 'mv dir1/dir2/dir3 dir1/dir2/dir3X' 
Deleting  dir1/dir2/dir3 
svn: Commit failed (details follow): 
svn: Directory '/dir1/dir2/dir3' is out of date 
$ svn status 
D  dir1/dir2/dir3 
D  dir1/dir2/dir3/test2X.txt 
D  dir1/dir2/dir3/test1.txt 
A + dir1/dir2/dir3X 
D + dir1/dir2/dir3X/test2.txt 
$ svn up 
    C dir1/dir2/dir3 
At revision 3. 
Summary of conflicts: 
    Tree conflicts: 1 

और यह है कि यह कैसे किया जाना चाहिए था है - फ़ाइल चाल के बाद एक svn up कर/नाम बदलने लागू किए गए किया गया था; ध्यान दें कि संस्करण संख्याओं svn update आदेश के बाद svn status -v परिवर्तन द्वारा रिपोर्ट:

$ cd /tmp 
$ rm -rf myrepo* 

$ svnadmin create myrepo 
$ svn co file:///tmp/myrepo myrepo-wc 
Checked out revision 0. 

$ cd myrepo-wc/ 
$ mkdir -p dir1/dir2/dir3 
$ svn add dir1/ 
A   dir1 
A   dir1/dir2 
A   dir1/dir2/dir3 
$ svn ci -m 'add dir1/' 
Adding   dir1 
Adding   dir1/dir2 
Adding   dir1/dir2/dir3 

Committed revision 1. 

$ echo test1 >> dir1/dir2/dir3/test1.txt 
$ echo test2 >> dir1/dir2/dir3/test2.txt 
$ svn add dir1/dir2/dir3/* 
A   dir1/dir2/dir3/test1.txt 
A   dir1/dir2/dir3/test2.txt 
$ svn status 
A  dir1/dir2/dir3/test2.txt 
A  dir1/dir2/dir3/test1.txt 
$ svn ci -m 'add dir1/dir2/dir3/*' 
Adding   dir1/dir2/dir3/test1.txt 
Adding   dir1/dir2/dir3/test2.txt 
Transmitting file data .. 
Committed revision 2. 

$ svn mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt 
A   dir1/dir2/dir3/test2X.txt 
D   dir1/dir2/dir3/test2.txt 
$ svn status 
D  dir1/dir2/dir3/test2.txt 
A + dir1/dir2/dir3/test2X.txt 
$ svn ci -m 'mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt' 
Deleting  dir1/dir2/dir3/test2.txt 
Adding   dir1/dir2/dir3/test2X.txt 

Committed revision 3. 

$ svn status 
$ svn status -v 
       0  0 ?   . 
       1  1 username dir1 
       1  1 username dir1/dir2 
       1  1 username dir1/dir2/dir3 
       3  3 username dir1/dir2/dir3/test2X.txt 
       2  2 username dir1/dir2/dir3/test1.txt 
$ svn up 
At revision 3. 
$ svn status -v 
       3  3 username . 
       3  3 username dir1 
       3  3 username dir1/dir2 
       3  3 username dir1/dir2/dir3 
       3  3 username dir1/dir2/dir3/test2X.txt 
       3  2 username dir1/dir2/dir3/test1.txt 
$ svn mv dir1/dir2/dir3 dir1/dir2/dir3X 
A   dir1/dir2/dir3X 
D   dir1/dir2/dir3/test2X.txt 
D   dir1/dir2/dir3/test1.txt 
D   dir1/dir2/dir3 
$ svn status 
D  dir1/dir2/dir3 
D  dir1/dir2/dir3/test2X.txt 
D  dir1/dir2/dir3/test1.txt 
A + dir1/dir2/dir3X 
$ svn ci -m 'mv dir1/dir2/dir3 dir1/dir2/dir3X' 
Deleting  dir1/dir2/dir3 
Adding   dir1/dir2/dir3X 

Committed revision 4. 

$ svn status 
$ svn status -v 
       3  3 username . 
       3  3 username dir1 
       3  3 username dir1/dir2 
       4  4 username dir1/dir2/dir3X 
       4  4 username dir1/dir2/dir3X/test2X.txt 
       4  4 username dir1/dir2/dir3X/test1.txt 
$ svn up 
At revision 4. 
$ svn status -v 
       4  4 username . 
       4  4 username dir1 
       4  4 username dir1/dir2 
       4  4 username dir1/dir2/dir3X 
       4  4 username dir1/dir2/dir3X/test2X.txt 
       4  4 username dir1/dir2/dir3X/test1.txt 

और के रूप में ओ पी ने कहा - एक एक नई चाल से पहले svn update करने के लिए भूल जाते हैं/नाम बदलने + प्रतिबद्ध है, और "प्रतिबद्ध विफल" हुई - तो प्रतिबद्ध कार्रवाई को पूरा करने में सक्षम होने के लिए svn resolve --accept working -R . का उपयोग कर सकते हैं।

संबंधित मुद्दे