Bagaimana cara menambahkan folder kosong dalam proyek Mercurial?


44

Dalam proyek saya, saya menggunakan Mercurial dan folder saat pengguna dapat mengunggah file. Tetapi karena pengguna akan mengunggah file, folder tersebut kosong.

Saya tidak tahu bagaimana saya bisa menambahkan folder ini ke proyek saya tanpa meletakkan file apa pun di dalamnya.

Apakah Anda tahu bagaimana saya bisa melakukannya?

Jawaban:


46

Mercurial hanya melacak file , bukan direktori .

Salah satu solusinya adalah menambahkan file .empty ke repositori Anda:

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

1
Ya, itu memang solusi yang tepat: Mercurial hanya melacak file , bukan direktori. Solusi lain adalah membuat direktori kosong ketika Anda menggunakan perangkat lunak Anda.
Martin Geisler

2
Saya pikir memberi nama itu .hgemptymungkin memberikan petunjuk yang lebih baik untuk apa
Pengguna

8
Ya atau.hgkeep
Natim

2
Lebih baik menggunakan verbose: .hgkeepifempty :)
Daniel Sokolowski

4

Saya telah membuat skrip python yang mengotomatiskan proses membuat / menghapus file-file itu.

Inilah sumber skripnya: 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

Tautannya sudah mati.
Natim

Benar, tautan yang diperbarui ...
mendezcode

2
host di bitbucket (atau) github, pastebin tua sudah tua
Phyo Arkar Lwin

-1, skrip itu mencontohkan pola-nti dan praktik buruk.
Nikratio

1

Anda cukup melakukan hal berikut:

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

Perhatikan hal berikut sebagai pertimbangan saat Anda melakukan ini:

Dalam kasus Anda, Anda mungkin mengunggah gambar di lingkungan pengembangan Anda, jadi saya juga akan merekomendasikan untuk menambahkan yang berikut ke .hgignorefile Anda sehingga Anda tidak sengaja melakukan gambar yang tidak ingin Anda lakukan:

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

Aturan akan mengabaikan semuanya images/**kecuali .hgkeepfile yang Anda perlukan untuk menambahkan folder "kosong" ke kontrol versi. Alasan mengapa aturan ini penting, adalah bahwa file apa pun di folder itu (mis. images/test-image.pngAkan terlihat seperti file non-versi baru di Anda hg statusjika Anda tidak mengabaikan pola itu.


2
Silakan baca pertanyaan itu lagi dengan seksama. Jawaban Anda tidak menjawab pertanyaan awal, yang bertanya "bagaimana cara menambahkan folder kosong" tidak "Bagaimana mengabaikan folder"
DavidPostill

1
Kamu benar. Saya telah memperbarui jawaban saya untuk benar-benar menjawab pertanyaan itu. Saya telah mengubah saran saya dan meninggalkannya karena penting untuk mengetahui dan 99% dari waktu perilaku yang diinginkan.
Paul Redmond

@ PaulRedmond bagaimana jika imagesdirektori jauh di jalan? Sesuatu seperti ./lectures/chapter_10/images? Apa itu sintaks yang tepat?
aaragon

@ aaragon memang sudah cukup lama sejak saya menggunakan Mercurial, tetapi Anda harus menyesuaikan regex agar cocok dengan pola yang Anda inginkan. Saat Anda melihat jalur yang Anda harapkan diabaikan, sesuaikan regex sesuai kebutuhan.
Paul Redmond
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.