¿Cómo agregar una carpeta vacía en un proyecto Mercurial?

44

En mi proyecto, estoy usando Mercurial y una carpeta en la que el usuario puede cargar el archivo. Pero como el usuario cargará archivos, la carpeta está vacía.

No sé cómo puedo agregar esta carpeta a mi proyecto sin poner ningún archivo dentro.

¿Sabes cómo puedo hacerlo?

Natim
fuente

Respuestas:

46

Mercurial solo realiza un seguimiento de los archivos , no de los directorios .

Una solución es agregar un archivo .empty a su repositorio:

$ touch uploads/.empty
$ hg add uploads/.empty
Natim
fuente
1
Sí, esa es la solución correcta: Mercurial solo realiza un seguimiento de los archivos , no de los directorios. Otra solución es crear los directorios vacíos cuando implemente su software.
Martin Geisler
2
Estoy pensando que nombrarlo .hgemptypodría dar una mejor idea de para qué sirve
Usuario
8
Sí o.hgkeep
Natim
2
Bien podría ir por detallado: .hgkeepifempty :)
Daniel Sokolowski
4

He creado un script de Python que automatiza el proceso de crear / eliminar esos archivos.

Aquí está la fuente del script: 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
fuente
El enlace está muerto.
Natim
Enlace verdadero y actualizado ...
mendezcode
2
alojarlo en bitbucket (o) github, viejo pastebin es viejo
Phyo Arkar Lwin
-1, ese script ejemplifica nti-patterns y malas prácticas.
Nikratio
1

Simplemente haz lo siguiente:

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

Tenga en cuenta lo siguiente como consideración cuando haga esto:

En su caso, puede estar cargando imágenes en su entorno de desarrollo, por lo que también recomendaría agregar lo siguiente a su .hgignorearchivo para que no confirme accidentalmente imágenes que no tenía la intención de comprometer:

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

La regla ignorará todo, images/**excepto el .hgkeeparchivo en el que necesita agregar una carpeta "vacía" al control de versiones. La razón por la cual esta regla es importante es que cualquier archivo en esa carpeta (es decir, images/test-image.pngse verá como un nuevo archivo no versionado en su archivo hg statussi no ignora ese patrón).

Paul Redmond
fuente
2
Por favor lea la pregunta otra vez cuidadosamente. Su respuesta no responde la pregunta original, que preguntaba "cómo agregar una carpeta vacía" y no "Cómo ignorar una carpeta"
DavidPostill
1
Tienes razón. He actualizado mi respuesta para responder realmente la pregunta. He alterado mi consejo y lo dejé porque es importante saberlo y el 99% del tiempo es un comportamiento deseado.
Paul Redmond
@PaulRedmond, ¿y si imageshay un directorio en el camino? Algo como ./lectures/chapter_10/images? ¿Cuál es entonces la sintaxis correcta?
aaragon
@aaragon es cierto que ha pasado un tiempo desde que usé Mercurial, pero tendrías que ajustar la expresión regular para que coincida con los patrones que pretendes. Cuando observe rutas que espera ignorar, ajuste la expresión regular según sea necesario.
Paul Redmond