Mercurial projesinde boş bir klasör nasıl eklenir?


44

Projemde Mercurial ve kullanıcının dosya yükleyebildiği bir klasör kullanıyorum. Ancak kullanıcı dosya yükleyeceğinden, klasör boştur.

İçine herhangi bir dosya koymadan bu klasörü projeme nasıl ekleyebilirim bilmiyorum.

Nasıl yapabilirim biliyor musun?

Yanıtlar:


46

Mercurial , dizinleri değil sadece dosyaları izler .

Çözümlerden biri, havuzunuza bir .empty dosyası eklemektir:

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

1
Evet, bu gerçekten doğru bir çözüm: Mercurial, dizinleri değil sadece dosyaları izliyor . Başka bir çözüm, yazılımınızı dağıtırken boş dizinler oluşturmaktır.
Martin Geisler

2
Bunun .hgemptyne olduğuna dair daha iyi bir ipucu verebileceğini isimlendirmeyi düşünüyorum .
Kullanıcı

8
Evet veya.hgkeep
Natim

2
Ayrıntılı bilgi için de gidin: .hgkeepifempty :)
Daniel Sokolowski

4

Bu dosyaları oluşturma / silme işlemini otomatikleştiren bir python betiği oluşturdum.

İşte betiğin kaynağı: 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

Bağlantı öldü.
Natim

Doğru, güncellenmiş bağlantı ...
mendezcode 11:12

2
bitbucket (veya) github'a ev sahipliği yapın, yaşlı pastebin yaşlı
Phyo Arkar Lwin

-1, bu senaryo nti-patternlerini ve hatalı uygulamaları örneklendirir.
Nikratio

1

Siz sadece aşağıdakileri yapın:

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

Bunu yaparken aşağıdakileri göz önünde bulundurun:

Sizin durumunuzda geliştirme ortamınıza resim yüklüyor olabilirsiniz, bu nedenle, .hgignoredosyaya aşağıdakileri eklemenizi de öneririm, böylece yanlışlıkla yapmak istemediğiniz görüntüleri yanlışlıkla işlemezsiniz:

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

Kural, sürüm kontrolüne "boş" bir klasör eklemeniz gereken dosya images/**dışındaki her şeyi görmezden gelir .hgkeep. Bu kuralın önemli olmasının nedeni, bu klasördeki herhangi bir dosyanın (ör. images/test-image.png, hg statusBu kalıbı görmezden gelirseniz, sürümünüzdeki yeni sürüm olmayan bir dosya gibi görünmesidir) .


2
Lütfen soruyu tekrar dikkatlice okuyunuz. Cevabınız yok değil "Klasör nasıl görmezden" değil "nasıl boş bir klasör eklemek için" istedi orijinal soruya cevap
DavidPostill

1
Haklısın. Aslında soruyu cevaplamak için cevabımı güncelledim. Tavsiyemi değiştirdim ve bıraktım çünkü zamanın% 99'unu bilmek ve davranışını bilmek önemlidir.
Paul Redmond

@PaulRedmond ya imagesyolun derinliklerinde bir dizin varsa ? Gibi bir şey ./lectures/chapter_10/images? Öyleyse doğru sözdizimi nedir?
aaragon

@aaragon kuşkusuz Mercurial kullandığımdan bu yana bir süre geçti, ancak regex'i niyetlediğiniz kalıplarla eşleşmesi için ayarlamanız gerekir. Yok sayılmasını beklediğiniz yolları fark ettiğinizde, regex'i gerektiği gibi ayarlayın.
Paul Redmond,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.