আপনি কি সাবভারশন দিয়ে আংশিক চেকআউট করতে পারেন?


155

আমার যদি ট্রাঙ্কের নিচে 20 ডিরেক্টরি থাকে / প্রতিটিটিতে প্রচুর ফাইল থাকে এবং কেবলমাত্র সেই ডিরেক্টরিগুলির মধ্যে 3 টির প্রয়োজন ছিল, কেবল ট্রাঙ্কের নীচে কেবল 3 টি ডিরেক্টরি দিয়ে একটি সাবভার্সন চেকআউট করা সম্ভব হবে কি?


আরও দেখুন: stackoverflow.com/questions/1667986/...
Nakilon

উত্তর:


78

সাবভার্সন 1.5 বিচ্ছিন্ন চেকআউটগুলি উপস্থাপন করে যা এমন কিছু হতে পারে যা আপনাকে দরকারী মনে হতে পারে। ডকুমেন্টেশন থেকে :

... স্পার্স ডিরেক্টরি (বা অগভীর চেকআউটগুলি ) ... আপনাকে সহজেই একটি ওয়ার্কিং অনুলিপি বা একটি ওয়ার্কিং কপির কিছু অংশ যাচাই করার অনুমতি দেয় - সম্পূর্ণ পুনরাবৃত্তির চেয়ে স্বল্পভাবে, পূর্বে উপেক্ষা করা ফাইল এবং উপ-ডিরেক্টরিগুলি একটিতে আনার স্বাধীনতার সাথে পরের বার.


259

প্রকৃতপক্ষে, এখানে আমার পোস্টে মন্তব্য করার জন্য ধন্যবাদ, দেখে মনে হচ্ছে বিরল ডিরেক্টরিগুলি যাওয়ার উপায়। আমি বিশ্বাস করি যে নিম্নলিখিতটি করা উচিত:

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পরিবর্তে । এইভাবে আপনি দেখতে পাচ্ছেন যে ডিরেক্টরিতে কোন ডিরেক্টরি উপস্থিত রয়েছে।emptytrunk/proj


@ জিগডনের উত্তরে উল্লিখিত হিসাবে আপনি একটি পুনরাবৃত্ত চেকআউটও করতে পারেন। এটি একটি অনুরূপ প্রভাব অর্জনের জন্য একটি পুরানো এবং কম নমনীয় উপায়:

svn checkout --non-recursive http://svnserver/trunk/proj
svn update trunk/foo
svn update trunk/bar
svn update trunk/baz

4
আমি যদি তখন ট্রাঙ্ক ডিরেক্টরিতে একটি এসএনএন আপডেট জারি করি তবে এটি অন্যান্য সমস্ত ফোল্ডারগুলি নীচে নামিয়ে দেবে, বা কেবল ইতিমধ্যে পুনরুদ্ধার করা হয়েছে এমনগুলি আপডেট করবে?
রব ওয়াকার

2
আমি Skipped 'prom/foo'পরে পেয়েছি svn update --set-depth infinity proj/foo:(
সাম

2
ওহ, আপনি গভীর (প্রোজ / ফু / বু) আপডেট করার আগে আপনাকে পিতামাতাকে (প্রোজ / ফু) আপডেট করতে হবে।
স্যাম

4
এটি একটি ভাল উত্তর এবং সত্যই, সঠিকভাবে চিহ্নিত হওয়া উচিত। ধন্যবাদ পকেডিং!
জিম্বো

1
আপনাকে মধ্যবর্তী পদক্ষেপটি ব্যবহার করতে হবে svn update --set-depth immediates projযাতে এটি আপডেট করার জন্য প্রজ / ফু তৈরি করে।
ক্রেগ

6

অথবা / ট্রাঙ্কের একটি পুনরাবৃত্ত চেকআউট করুন, তারপরে আপনার প্রয়োজনীয় 3 ডিরেক্টরিতে ম্যানুয়াল আপডেট করুন।


6

জটিল স্পার্স চেকআউটগুলি স্বয়ংক্রিয় করতে আমি একটি স্ক্রিপ্ট লিখেছিলাম।

#!/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)

0

আপনার কাছে ইতিমধ্যে সম্পূর্ণ স্থানীয় অনুলিপি থাকলে, আপনি --set-depthকমান্ড ব্যবহার করে অযাচিত সাব ফোল্ডারগুলি সরাতে পারেন ।

svn update --set-depth=exclude www

দেখুন: http://blogs.collab.net/subversion/sparse-directories- এখন-with- বাদ

set-depthকমান্ড সমর্থন multipile পাথ।

রুট লোকাল কপি আপডেট করা পরিবর্তিত ফোল্ডারের গভীরতা পরিবর্তন করবে না।

ফোল্ডারটি পুনরায় আকারে চেকআউট করার জন্য পুনরুদ্ধার করতে আপনি --set-depthঅনন্ত প্যারাম দিয়ে আবার ব্যবহার করতে পারেন ।

svn update --set-depth=infinity www

-1

প্রকার, রকম. যেমন ববি বলেছেন:

svn co file:///.../trunk/foo file:///.../trunk/bar file:///.../trunk/hum

ফোল্ডারগুলি পাবেন তবে আপনি সাবভার্জন দৃষ্টিভঙ্গি থেকে পৃথক ফোল্ডার পাবেন। আপনাকে প্রতিটি সাবফোল্ডারে পৃথক কমিট এবং আপডেট যেতে হবে।

আমি বিশ্বাস করি না আপনি আংশিক গাছটি চেকআউট করতে পারবেন এবং তারপরে আংশিক গাছের সাথে একক সত্তা হিসাবে কাজ করতে পারবেন।


-10

কোনও বিশেষ উপকারী উপায়ে নয়, না। আপনি সাবট্রিজগুলি পরীক্ষা করতে পারেন (ববি জ্যাকের পরামর্শ অনুসারে), তবে তারপরে আপনি এটমিকভাবে আপডেট / কমিট করার ক্ষমতা হারাবেন; এটি করার জন্য, তাদের তাদের সাধারণ পিতামাতার অধীনে স্থাপন করা দরকার এবং আপনি সাধারণ পিতামাতাকে যাচাই করার সাথে সাথে আপনি সেই পিতামাতার অধীনে সমস্ত কিছু ডাউনলোড করবেন। নন-রিকার্সিভ একটি ভাল বিকল্প নয়, কারণ আপনি আপডেটগুলি চান এবং পুনরাবৃত্ত হওয়ার জন্য প্রতিশ্রুতিবদ্ধ।


16
-১ একটি উত্তরের জন্য যা কেবল ভুল। বাস্তব জীবনে প্রচুর ব্যবহারের কেস রয়েছে যেখানে আপনি একটি বৃহত প্রকল্পের উপাদানগুলির কেবলমাত্র একটি ছোট উপসেটে কাজ করতে চান এবং আপনি পুরো প্রকল্পটি পরীক্ষা করতে চান না।
পিটার

কারণ হিসাবে আপনি এই সাবট্রির সাথে স্বতন্ত্রভাবে একে অপরের সাথে কাজ করতে পারেন, তবে আমার কাছে মনে হয় যে ড্রিপিজা বলতে এক্ষেত্রে অ পারমাণবিক চুক্তি / আপডেট নয়। এবং এটি একটি নির্দিষ্ট অবস্থায় সমস্যা হতে পারে।
এন্ড্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.