46 votes

Comment ajouter un dossier vide dans un projet Mercurial ?

Dans mon projet, j'utilise Mercurial et un dossier dans lequel l'utilisateur peut télécharger des fichiers. Mais étant donné que l'utilisateur téléchargera des fichiers, le dossier est vide.

Je ne sais pas comment je peux ajouter ce dossier à mon projet sans y mettre de fichier à l'intérieur.

Savez-vous comment je peux faire ?

48voto

Ankur Loriya Points 205

Mercurial ne garde la trace que des fichiers, pas des répertoires.

Une solution consiste à ajouter un fichier .empty à votre dépôt :

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

1 votes

Oui, c'est en effet la bonne solution : Mercurial ne garde la trace que des fichiers, pas des répertoires. Une autre solution est de créer les répertoires vides lorsque vous déployez votre logiciel.

2 votes

Je pense que l'appeler .hgempty pourrait donner une meilleure indication de son utilité.

9 votes

Oui ou .hgkeep

4voto

MvG Points 1456

J'ai créé un script python qui automatise le processus de création/suppression de ces fichiers.

Voici la source du script : http://pastebin.com/inbYmMut

#!/usr/bin/python

# Copyright (c) 2011 Ernesto Mendez (der-design.com)
# Double licence sous les licences MIT et GPL :
# http://www.opensource.org/licenses/mit-license.php
# http://www.gnu.org/licenses/gpl.html

# Version 1.0.0
# - Première version

from __future__ import generators
import sys
from optparse import OptionParser
import os

def main():
    # Traiter les arguments

    if len(args) > 1:
        parser.error('Trop d\'arguments')
        sys.exit()

    elif len(args) == 0:
        parser.error('Nom de fichier manquant')
        sys.exit()

    if not os.path.exists(options.directory):
        parser.error("%s : Aucun répertoire de ce nom" % options.directory)
        sys.exit()

    filename = args[0]

    # Créer un générateur

    filetree = dirwalk(os.path.abspath(options.directory))

    # Parcourir l'arborescence des répertoires, créer des fichiers

    if options.remove == True:

        removed = ['Suppression des fichiers suivants : \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 "Aucun fichier nommé '%s' trouvé" % filename
            sys.exit()

    # Parcourir l'arborescence des répertoires, supprimer les fichiers

    else:

        created = ["Création des fichiers suivants : \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 "Aucun répertoire vide trouvé"
            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):  # recursion dans le sous-répertoire
                    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="Ajouter ou supprimer des fichiers de placeholder pour les outils SCM (Source Control Management) qui ne prennent pas en charge les répertoires vides.")
    parser.add_option("-p", "--path", dest="directory", help="rechercher dans PATH", metavar="PATH")
    parser.add_option("-r", "--remove", dest="remove", action="store_true", help="supprimer le FICHIER de PATH, s'il est le seul fichier sur PATH")

    (options, args) = parser.parse_args()

if __name__ == '__main__':
    print
    init_options()
    main()
    print

0 votes

Le lien est mort.

0 votes

Vrai, lien mis à jour...

2 votes

Hébergez-le sur bitbucket (ou) github, old pastebin is old

1voto

Paul Redmond Points 121

Il vous suffit de faire ce qui suit :

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

Notez ce qui suit comme considération lorsque vous faites cela :

Dans votre cas, vous pourriez être en train de télécharger des images dans votre environnement de développement, donc je recommanderais également d'ajouter ce qui suit à votre fichier .hgignore afin de ne pas commettre accidentellement des images que vous n'aviez pas l'intention de commettre :

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

La règle ignorera tout dans images/** sauf le fichier .hgkeep que vous devez ajouter à un dossier "vide" pour le contrôle de version. La raison pour laquelle cette règle est importante, c'est que tout fichier dans ce dossier (c'est-à-dire images/test-image.png) apparaîtra comme un nouveau fichier non versionné dans votre hg status si vous n'ignorez pas ce motif.

2 votes

Veuillez relire attentivement la question. Votre réponse ne correspond pas à la question initiale, qui demandait "comment ajouter un dossier vide" et non "Comment ignorer un dossier"

1 votes

Tu as raison. J'ai mis à jour ma réponse pour répondre effectivement à la question. J'ai modifié mon conseil et je l'ai laissé car il est important de le savoir et 99% du temps un comportement souhaité.

0 votes

@PaulRedmond Et si images est un répertoire profondément enfoui dans le chemin? Quelque chose comme ./lectures/chapter_10/images? Quelle est alors la bonne syntaxe?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X