如何在Mercurial项目中添加一个空文件夹?


44

在我的项目中,我正在使用Mercurial和一个用户可以上传文件的文件夹。但是由于用户将上传文件,因此该文件夹为空。

我不知道如何在不放入任何文件的情况下将该文件夹添加到我的项目中。

你知道我该怎么办吗?

Answers:


46

Mercurial仅跟踪文件而不跟踪目录

一种解决方案是向存储库中添加一个.empty文件:

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

1
是的,这确实是正确的解决方案:Mercurial仅跟踪文件,而不跟踪目录。另一个解决方案是在部署软件时创建空目录。
马丁·盖斯勒

2
我正在考虑命名它.hgempty可能是一个更好的线索
用户

8
是或.hgkeep
Natim 2012年

2
不妨进行详细说明:.hgkeepifempty :)
Daniel Sokolowski13年

4

我创建了一个python脚本,该脚本可以自动化创建/删除这些文件的过程。

这是脚本的来源: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

链接已死。
Natim 2012年

真实的,更新的链接...
mendezcode 2012年

2
将其托管在bitbucket(或github)上,旧的pastebin很旧
Phyo Arkar Lwin 2012年

-1,该脚本举例说明了nti模式和不良做法。
Nikratio

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.pnghg status如果您不忽略该模式,在您的文件夹中将看起来像一个新的非版本文件)。


2
请仔细阅读问题。您的回答没有回答原始问题,该问题询问“如何添加一个空文件夹”而不是“如何忽略文件夹”
DavidPostill

1
你是对的。我已经更新了答案,以实际回答问题。我已经更改了建议,并留下了建议,因为重要的是要知道并有99%的时间了解期望的行为。
保罗·雷德蒙德

@PaulRedmond如果images目录位于路径深处怎么办?像./lectures/chapter_10/images什么?那么正确的语法是什么?
aaragon

@aaragon坦白说,自从我使用Mercurial以来已经有一段时间了,但是您需要调整正则表达式以匹配您想要的模式。当您发现希望忽略的路径时,请根据需要调整正则表达式。
Paul Redmond
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.