अगर मेरे पास 20 निर्देशिकाएं ट्रंक के तहत / प्रत्येक में बहुत सारी फ़ाइलों के साथ और केवल उन निर्देशिकाओं में से 3 की आवश्यकता है, तो क्या ट्रंक के तहत केवल उन 3 निर्देशिकाओं के साथ एक सबवर्सन चेकआउट करना संभव होगा?
अगर मेरे पास 20 निर्देशिकाएं ट्रंक के तहत / प्रत्येक में बहुत सारी फ़ाइलों के साथ और केवल उन निर्देशिकाओं में से 3 की आवश्यकता है, तो क्या ट्रंक के तहत केवल उन 3 निर्देशिकाओं के साथ एक सबवर्सन चेकआउट करना संभव होगा?
जवाबों:
तोड़फोड़ 1.5 विरल चेकआउट का परिचय देता है जो आपको उपयोगी हो सकता है। से प्रलेखन :
... विरल निर्देशिका (या उथले चेकआउट ) ... आप आसानी से एक काम की नकल की जाँच करने के लिए अनुमति देता है - या एक काम की नकल के एक हिस्से - पूर्ण पुनरावृत्ति की तुलना में अधिक उथले, पहले से नजरअंदाज की गई फ़ाइलों और उपनिर्देशिकाओं में लाने की स्वतंत्रता के साथ बाद का समय।
दरअसल, यहां मेरी पोस्ट के लिए टिप्पणियों के लिए धन्यवाद, ऐसा लगता है कि विरल निर्देशिकाएं जाने का रास्ता हैं। मेरा मानना है कि निम्नलिखित को यह करना चाहिए:
svn checkout --depth empty http://svnserver/trunk/proj
svn update --set-depth infinity proj/foo
svn update --set-depth infinity proj/bar
svn update --set-depth infinity proj/baz
वैकल्पिक रूप से, उनकी सामग्री के बिना फ़ाइलों और निर्देशिकाओं --depth immediates
की empty
जाँच के बजाय trunk/proj
। इस तरह से आप देख सकते हैं कि रिपॉजिटरी में कौन से डायरेक्टरी मौजूद हैं।
जैसा कि @ ज़िग्डन के उत्तर में बताया गया है, आप एक गैर-पुनरावर्ती चेकआउट भी कर सकते हैं। यह समान प्रभाव प्राप्त करने का एक पुराना और कम लचीला तरीका है:
svn checkout --non-recursive http://svnserver/trunk/proj
svn update trunk/foo
svn update trunk/bar
svn update trunk/baz
Skipped 'prom/foo'
बाद में मिलता है svn update --set-depth infinity proj/foo
:(
svn update --set-depth immediates proj
ताकि यह अद्यतन करने के लिए प्रोज / फू बना दे।
मैंने जटिल विरल चेकआउट को स्वचालित करने के लिए एक स्क्रिप्ट लिखी थी।
#!/usr/bin/env python
'''
This script makes a sparse checkout of an SVN tree in the current working directory.
Given a list of paths in an SVN repository, it will:
1. Checkout the common root directory
2. Update with depth=empty for intermediate directories
3. Update with depth=infinity for the leaf directories
'''
import os
import getpass
import pysvn
__author__ = "Karl Ostmo"
__date__ = "July 13, 2011"
# =============================================================================
# XXX The os.path.commonprefix() function does not behave as expected!
# See here: http://mail.python.org/pipermail/python-dev/2002-December/030947.html
# and here: http://nedbatchelder.com/blog/201003/whats_the_point_of_ospathcommonprefix.html
# and here (what ever happened?): http://bugs.python.org/issue400788
from itertools import takewhile
def allnamesequal(name):
return all(n==name[0] for n in name[1:])
def commonprefix(paths, sep='/'):
bydirectorylevels = zip(*[p.split(sep) for p in paths])
return sep.join(x[0] for x in takewhile(allnamesequal, bydirectorylevels))
# =============================================================================
def getSvnClient(options):
password = options.svn_password
if not password:
password = getpass.getpass('Enter SVN password for user "%s": ' % options.svn_username)
client = pysvn.Client()
client.callback_get_login = lambda realm, username, may_save: (True, options.svn_username, password, True)
return client
# =============================================================================
def sparse_update_with_feedback(client, new_update_path):
revision_list = client.update(new_update_path, depth=pysvn.depth.empty)
# =============================================================================
def sparse_checkout(options, client, repo_url, sparse_path, local_checkout_root):
path_segments = sparse_path.split(os.sep)
path_segments.reverse()
# Update the middle path segments
new_update_path = local_checkout_root
while len(path_segments) > 1:
path_segment = path_segments.pop()
new_update_path = os.path.join(new_update_path, path_segment)
sparse_update_with_feedback(client, new_update_path)
if options.verbose:
print "Added internal node:", path_segment
# Update the leaf path segment, fully-recursive
leaf_segment = path_segments.pop()
new_update_path = os.path.join(new_update_path, leaf_segment)
if options.verbose:
print "Will now update with 'recursive':", new_update_path
update_revision_list = client.update(new_update_path)
if options.verbose:
for revision in update_revision_list:
print "- Finished updating %s to revision: %d" % (new_update_path, revision.number)
# =============================================================================
def group_sparse_checkout(options, client, repo_url, sparse_path_list, local_checkout_root):
if not sparse_path_list:
print "Nothing to do!"
return
checkout_path = None
if len(sparse_path_list) > 1:
checkout_path = commonprefix(sparse_path_list)
else:
checkout_path = sparse_path_list[0].split(os.sep)[0]
root_checkout_url = os.path.join(repo_url, checkout_path).replace("\\", "/")
revision = client.checkout(root_checkout_url, local_checkout_root, depth=pysvn.depth.empty)
checkout_path_segments = checkout_path.split(os.sep)
for sparse_path in sparse_path_list:
# Remove the leading path segments
path_segments = sparse_path.split(os.sep)
start_segment_index = 0
for i, segment in enumerate(checkout_path_segments):
if segment == path_segments[i]:
start_segment_index += 1
else:
break
pruned_path = os.sep.join(path_segments[start_segment_index:])
sparse_checkout(options, client, repo_url, pruned_path, local_checkout_root)
# =============================================================================
if __name__ == "__main__":
from optparse import OptionParser
usage = """%prog [path2] [more paths...]"""
default_repo_url = "http://svn.example.com/MyRepository"
default_checkout_path = "sparse_trunk"
parser = OptionParser(usage)
parser.add_option("-r", "--repo_url", type="str", default=default_repo_url, dest="repo_url", help='Repository URL (default: "%s")' % default_repo_url)
parser.add_option("-l", "--local_path", type="str", default=default_checkout_path, dest="local_path", help='Local checkout path (default: "%s")' % default_checkout_path)
default_username = getpass.getuser()
parser.add_option("-u", "--username", type="str", default=default_username, dest="svn_username", help='SVN login username (default: "%s")' % default_username)
parser.add_option("-p", "--password", type="str", dest="svn_password", help="SVN login password")
parser.add_option("-v", "--verbose", action="store_true", default=False, dest="verbose", help="Verbose output")
(options, args) = parser.parse_args()
client = getSvnClient(options)
group_sparse_checkout(
options,
client,
options.repo_url,
map(os.path.relpath, args),
options.local_path)
यदि आपके पास पहले से ही पूर्ण स्थानीय प्रतिलिपि है, तो आप --set-depth
कमांड का उपयोग करके अवांछित उप फ़ोल्डर्स को हटा सकते हैं ।
svn update --set-depth=exclude www
देख: http://blogs.collab.net/subversion/sparse-directories-now-with-exclusion
set-depth
आदेश समर्थन multipile पथ।
रूट स्थानीय प्रतिलिपि को अपडेट करने से संशोधित फ़ोल्डर की गहराई नहीं बदलेगी।
पुनरावर्ती चेकआउट करने के लिए फ़ोल्डर को पुनर्स्थापित करने के लिए, आप --set-depth
फिर से अनंत परम के साथ उपयोग कर सकते हैं ।
svn update --set-depth=infinity www
की तरह। जैसा बॉबी कहता है:
svn co file:///.../trunk/foo file:///.../trunk/bar file:///.../trunk/hum
फ़ोल्डर्स मिल जाएगा, लेकिन आप एक तोड़फोड़ परिप्रेक्ष्य से अलग फ़ोल्डर मिल जाएगा। आपको प्रत्येक सबफ़ोल्डर पर अलग-अलग कमिट और अपडेट्स करने होंगे।
मुझे विश्वास नहीं है कि आप आंशिक पेड़ की जांच कर सकते हैं और फिर एक इकाई के रूप में आंशिक पेड़ के साथ काम कर सकते हैं।
किसी विशेष रूप से उपयोगी तरीके से नहीं, नहीं। आप उपशीर्षक (बॉबी जैक के सुझाव के अनुसार) की जांच कर सकते हैं, लेकिन फिर आप उन्हें परमाणु अद्यतन / प्रतिबद्ध करने की क्षमता खो देते हैं; ऐसा करने के लिए, उन्हें अपने सामान्य माता-पिता के अधीन रखा जाना चाहिए, और जैसे ही आप सामान्य माता-पिता की जांच करेंगे, आप उस माता-पिता के अधीन सब कुछ डाउनलोड कर लेंगे। गैर-पुनरावर्ती एक अच्छा विकल्प नहीं है, क्योंकि आप अपडेट चाहते हैं और पुनरावर्ती होना चाहते हैं।