मर्क्यूरियल प्रोजेक्ट में खाली फ़ोल्डर कैसे जोड़ें?


44

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

मुझे नहीं पता कि मैं बिना किसी फ़ाइल के अंदर इस फ़ोल्डर को अपनी परियोजना में कैसे जोड़ सकता हूं।

क्या आप जानते हैं कि मैं कैसे कर सकता हूं?

जवाबों:


46

मर्क्यूरियल केवल फाइलों का ट्रैक रखता है , निर्देशिकाओं का नहीं

एक समाधान अपने रिपॉजिटरी में एक .empty फ़ाइल जोड़ने के लिए है:

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

1
हां, यह वास्तव में सही समाधान है: मर्क्यूरियल केवल फाइलों का ट्रैक रख रहा है , निर्देशिकाओं का नहीं। एक अन्य समाधान यह है कि जब आप अपने सॉफ़्टवेयर को तैनात करते हैं तो खाली निर्देशिकाओं का निर्माण करें।
मार्टिन गेइस्लर

2
मैं सोच रहा हूँ कि यह .hgemptyएक बेहतर सुराग दे सकता है जैसा कि इसके लिए है
उपयोगकर्ता

8
हां या.hgkeep
नटिम

2
साथ ही साथ क्रिया के लिए भी जा सकते हैं: .hhgififempty :)
डैनियल

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
इसे बिटकबेट (या)
गीथूब

-1, यह लिपि nti- पैटर्न और बुरी प्रथाओं का उदाहरण देती है।
निक्त्रियो

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.png, hg statusयदि आप उस पैटर्न को अनदेखा नहीं करते हैं तो आपके लिए एक नई गैर-संस्करणित फ़ाइल की तरह दिखाई देगी ।


2
कृपया प्रश्न को फिर से ध्यान से पढ़ें। आपका जवाब है नहीं मूल प्रश्न है, जो पूछा, "कैसे एक फ़ोल्डर अनदेखी करने के लिए" नहीं "कैसे कोई खाली फोल्डर जोड़ने के लिए" का जवाब
DavidPostill

1
आप सही हे। मैंने वास्तव में प्रश्न का उत्तर देने के लिए अपना उत्तर अपडेट कर दिया है। मैंने अपनी सलाह को बदल दिया है और इसे छोड़ दिया है क्योंकि यह जानना महत्वपूर्ण है और 99% समय एक वांछित व्यवहार है।
पॉल रेडमंड

@PaRRedmond क्या है अगर imagesमार्ग में एक निर्देशिका गहरी है? कुछ पसंद है ./lectures/chapter_10/images? फिर सही वाक्यविन्यास क्या है?
अनारगन

@ राहगन ने स्वीकार किया कि मर्क्यूरियल का इस्तेमाल करने के बाद से मुझे इसमें थोड़ी देर हो गई है, लेकिन आपको रेगेक्स को मैच पैटर्न के साथ जोड़ने की जरूरत होगी। जैसा कि आप उन रास्तों को नोटिस करते हैं जिन्हें आप अनदेखा करने की अपेक्षा करते हैं, आवश्यकतानुसार रेग्क्स को समायोजित करें।
पॉल रेडमंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.