Làm thế nào để thêm một thư mục trống trong dự án Mercurial?


44

Trong dự án của tôi, tôi đang sử dụng Mercurial và một thư mục khi người dùng có thể tải lên tệp. Nhưng vì người dùng sẽ tải lên các tập tin, thư mục trống.

Tôi không biết làm thế nào tôi có thể thêm thư mục này vào dự án của mình mà không đặt bất kỳ tệp nào vào trong.

Bạn có biết làm thế nào tôi có thể làm?

Câu trả lời:


46

Mercurial chỉ theo dõi các tập tin , không phải thư mục .

Một giải pháp là thêm tệp .empty vào kho lưu trữ của bạn:

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

1
Vâng, đó thực sự là giải pháp chính xác: Mercurial chỉ theo dõi các tập tin , không phải thư mục. Một giải pháp khác là tạo các thư mục trống khi bạn triển khai phần mềm của mình.
Martin Geisler

2
Tôi đang nghĩ việc đặt tên nó .hgemptycó thể mang lại manh mối tốt hơn cho mục đích của nó
Người dùng

8
Có hoặc.hgkeep
Natim

2
Cũng có thể đi dài dòng: .hgkeepifempty :)
Daniel Sokolowski

4

Tôi đã tạo một tập lệnh python tự động hóa quá trình tạo / xóa các tập tin đó.

Đây là nguồn của tập lệnh: 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

Liên kết đã chết.
Natim

Đúng, liên kết được cập nhật ...
mendezcode

2
lưu trữ nó trên bitbucket (hoặc) github, pastebin cũ đã cũ
Phyo Arkar Lwin

-1, tập lệnh đó minh họa các mô hình và các thực hành xấu.
Nikratio

1

Bạn chỉ cần làm như sau:

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

Lưu ý những điều sau đây là một sự cân nhắc khi bạn làm điều này:

Trong trường hợp của bạn, bạn có thể tải lên hình ảnh trong môi trường phát triển của mình, vì vậy tôi cũng khuyên bạn nên thêm những điều sau vào .hgignoretệp của mình để bạn không vô tình phạm phải những hình ảnh mà bạn không có ý định cam kết:

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

Quy tắc sẽ bỏ qua mọi thứ trên images/**trừ .hgkeeptệp bạn cần thêm thư mục "trống" vào kiểm soát phiên bản. Lý do tại sao quy tắc này rất quan trọng, là bất kỳ tệp nào trong thư mục đó (nghĩa là images/test-image.pngsẽ trông giống như một tệp không có phiên bản mới trong của bạn hg statusnếu bạn không bỏ qua mẫu đó.


2
Xin vui lòng đọc lại câu hỏi một cách cẩn thận. Câu trả lời của bạn không trả lời câu hỏi ban đầu, câu hỏi "làm thế nào để thêm một thư mục trống" chứ không phải "Làm thế nào để bỏ qua một thư mục"
DavidPostill

1
Bạn đúng. Tôi đã cập nhật câu trả lời của mình để thực sự trả lời câu hỏi. Tôi đã thay đổi lời khuyên của mình và bỏ qua nó vì điều quan trọng là phải biết và 99% thời gian là một hành vi mong muốn.
Paul Redmond

@PaulRedmond nếu imagesmột thư mục nằm sâu trong đường dẫn thì sao? Một cái gì đó như thế ./lectures/chapter_10/imagesnào? Cú pháp đúng là gì?
aaragon

@aaragon thừa nhận đã được một thời gian kể từ khi tôi sử dụng Mercurial, nhưng bạn sẽ cần điều chỉnh regex để phù hợp với các mẫu bạn dự định. Khi bạn nhận thấy các đường dẫn mà bạn muốn bỏ qua, hãy điều chỉnh regex khi cần.
Paul Redmond
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.