একটি মার্চুরিয়াল প্রকল্পে একটি খালি ফোল্ডার কীভাবে যুক্ত করবেন?


44

আমার প্রকল্পে, যখন ব্যবহারকারী ফাইল আপলোড করতে পারে তখন আমি মার্চুরিয়াল এবং একটি ফোল্ডার ব্যবহার করছি। তবে যেহেতু ব্যবহারকারী ফাইল আপলোড করবেন তাই ফোল্ডারটি খালি রয়েছে।

কোনও ফাইলের ভিতরে না রেখে আমি কীভাবে এই ফোল্ডারটিকে আমার প্রকল্পে যুক্ত করতে পারি তা আমি জানি না।

আমি কি করতে পারি জানো?

উত্তর:


46

মার্চুরিয়াল কেবলমাত্র ফাইলগুলিই ট্র্যাক করে রাখে , ডিরেক্টরি নয়

একটি সমাধান হ'ল আপনার ভাণ্ডারে একটি .empty ফাইল যুক্ত করা:

$ touch uploads/.empty
$ hg add uploads/.empty

1
হ্যাঁ, এটি প্রকৃতপক্ষে সঠিক সমাধান: মার্চুরিয়াল কেবলমাত্র ফাইলের উপর নজর রাখছে , ডিরেক্টরি নয়। আরেকটি সমাধান হ'ল আপনি যখন নিজের সফ্টওয়্যারটি স্থাপন করবেন তখন খালি ডিরেক্টরিগুলি তৈরি করা।
মার্টিন গিজার

2
আমি নামকরণের কথা ভাবছি এটির .hgemptyজন্য এটির জন্য আরও ভাল ধারণা দেওয়া হতে পারে
ব্যবহারকারী

8
হ্যাঁ বা.hgkeep
নাতিম

2
ভার্চুজের জন্যও যেতে পারেন: .hgkeepifempty :)
ড্যানিয়েল

4

আমি একটি পাইথন স্ক্রিপ্ট তৈরি করেছি যা এই ফাইলগুলি তৈরি / মুছতে প্রক্রিয়াটিকে স্বয়ংক্রিয় করে তোলে।

এখানে স্ক্রিপ্টের উত্স: http://pastebin.com/inbYmMut

#!/usr/bin/python

# Copyright (c) 2011 Ernesto Mendez (der-design.com)
# Dual licensed under the MIT and GPL licenses:
# http://www.opensource.org/licenses/mit-license.php
# http://www.gnu.org/licenses/gpl.html

# Version 1.0.0
# - Initial Release

from __future__ import generators
import sys
from optparse import OptionParser
import os

def main():
    # Process arguments

    if len(args) > 1:
        parser.error('Too many arguments')
        sys.exit()

    elif len(args) == 0:
        parser.error('Missing filename')
        sys.exit()

    if not os.path.exists(options.directory):
        parser.error("%s: No such directory" % options.directory)
        sys.exit()

    filename = args[0]

    # Create generator

    filetree = dirwalk(os.path.abspath(options.directory))

    # Walk directory tree, create files

    if options.remove == True:

        removed = ['Removing the following files: \n']
        cmd = "rm"

        for file in filetree:
            if (os.path.basename(file) == filename):
                removed.append(file)
                cmd += " %s" % fixpath(file)

        if cmd != "rm":
            for f in removed: print f
            os.system(cmd)
        else:
            print "No files named '%s' found" % filename
            sys.exit()

    # Walk directory tree, delete files

    else:

        created = ["Creating the following files:\n"]
        cmd = "touch"

        for file in filetree:
            if (os.path.isdir(file)):
                created.append("%s%s" % (file, filename))
                cmd += " " + fixpath("%s%s" % (file, filename))

        if cmd != "touch":
            for f in created: print f
            os.system(cmd)
        else:
            print "No empty directories found"
            sys.exit()


def dirwalk(dir, giveDirs=1):
    # http://code.activestate.com/recipes/105873-walk-a-directory-tree-using-a-generator/
    for f in os.listdir(dir):
        fullpath = os.path.join(dir, f)
        if os.path.isdir(fullpath) and not os.path.islink(fullpath):
            if not len(os.listdir(fullpath)):
                yield fullpath + os.sep
            else:
                for x in dirwalk(fullpath):  # recurse into subdir
                    if os.path.isdir(x):
                        if giveDirs:
                            yield x
                    else:
                        yield x
        else:
            yield fullpath


def wrap(text, width):
    return reduce(lambda line, word, width=width: '%s%s%s' % (line, ' \n'[(len(line)-line.rfind('\n')-1 + len(word.split('\n', 1)[0] ) >= width)], word), text.split(' ') )


def fixpath(p):
    return shellquote(os.path.normpath(p))


def shellquote(s):
    return "'" + s.replace("'", "'\\''") + "'"


def init_options():
    global parser, options, args
    parser = OptionParser(usage="usage: %prog [options] filename", description="Add or Remove placeholder files for SCM (Source Control Management) tools that do not support empty directories.")
    parser.add_option("-p", "--path", dest="directory", help="search within PATH", metavar="PATH")
    parser.add_option("-r", "--remove", dest="remove", action="store_true", help="remove FILE from PATH, if it's the only file on PATH")

    (options, args) = parser.parse_args()

if __name__ == '__main__':
    print
    init_options()
    main()
    print

লিঙ্কটি মারা গেছে।
নাতিম

সত্য, আপডেট হওয়া লিংক ...
mendezcode

2
এটি বিটবাকেটে (বা) গিথুব এ হোস্ট করুন, পুরাতন পেস্টবিন পুরানো
Phyo আরকার লুইন

-1, এই স্ক্রিপ্টটি এনটি-প্যাটার্ন এবং খারাপ অভ্যাসগুলির উদাহরণ দেয়।
নিক্রিতিও

1

আপনি কেবল নিম্নলিখিতটি করেন:

mkdir images && touch images/.hgkeep
hg add images/.hgkeep
hg commit -m"Add the images folder as an empty folder"

আপনি যখন এটি করবেন তখন বিবেচনা হিসাবে নিম্নলিখিতটি নোট করুন:

আপনার ক্ষেত্রে আপনি সম্ভবত আপনার বিকাশের পরিবেশে চিত্রগুলি আপলোড করছেন, তাই আমি আপনার .hgignoreফাইলটিতে নিম্নলিখিতগুলি যুক্ত করার পরামর্শ দিচ্ছি যাতে আপনি দুর্ঘটনাক্রমে যে চিত্রগুলি প্রতিশ্রুতি দেওয়ার ইচ্ছা করেননি তা প্রতিশ্রুতিবদ্ধ না:

^(images)\/(?!\.hgkeep)

সংস্করণ নিয়ন্ত্রণে আপনাকে "খালি" ফোল্ডার যুক্ত করার দরকার আছে images/**এমন .hgkeepফাইল ব্যতীত নিয়মটি এড়িয়ে যাবে । এই নিয়মটি গুরুত্বপূর্ণ হওয়ার কারণটি হ'ল সেই ফোল্ডারে থাকা কোনও ফাইল (যেমন images/test-image.pngyou hg statusআপনি যদি সেই ধরণটিকে অগ্রাহ্য না করেন তবে আপনার কোনও নতুন সংস্করণযুক্ত ফাইলের মতো দেখাবে) ।


2
প্রশ্নটি আবার মনোযোগ সহকারে পড়ুন। আপনার উত্তরটি মূল প্রশ্নের উত্তর দেয় না , যা "খালি ফোল্ডারটি কীভাবে যুক্ত করবেন" "কীভাবে কোনও ফোল্ডারকে উপেক্ষা করবেন না"
ডেভিডপস্টিল

1
তুমি ঠিক বলছো. আমি আসলে উত্তরটি আমার উত্তর আপডেট করেছি। আমি আমার পরামর্শ পরিবর্তন করেছি এবং রেখেছি কারণ এটি জানা গুরুত্বপূর্ণ এবং 99% সময় একটি পছন্দসই আচরণ।
পল রেডমন্ড

@ পাউলিআরডমন্ড যদি imagesকোনও ডিরেক্টরিটির গভীরে থাকে? এরকম কিছু ./lectures/chapter_10/images? তাহলে সঠিক বাক্য গঠন কী?
অ্যারাগন

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