วิธีเพิ่มโฟลเดอร์ว่างในโครงการ Mercurial


42

ในโครงการของฉันฉันใช้ Mercurial และโฟลเดอร์ในเมื่อผู้ใช้สามารถอัปโหลดไฟล์ แต่เนื่องจากผู้ใช้จะอัปโหลดไฟล์โฟลเดอร์จึงว่างเปล่า

ฉันไม่รู้ว่าฉันจะเพิ่มโฟลเดอร์นี้ลงในโครงการของฉันได้อย่างไรโดยไม่ต้องใส่ไฟล์เข้าไปข้างใน

คุณรู้หรือไม่ว่าฉันจะทำอย่างไร

คำตอบ:


44

Mercurial คอยติดตามเท่านั้น ไฟล์ , ไม่ใช่ไดเรกทอรี .

ทางออกหนึ่งคือการเพิ่มไฟล์. ที่ว่างลงในที่เก็บของคุณ:

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

1
ใช่แล้วนั่นคือทางออกที่ถูกต้อง: Mercurial คอยติดตามเท่านั้น ไฟล์ ไม่ใช่ไดเรกทอรี อีกวิธีคือสร้างไดเรกทอรีว่างเมื่อคุณปรับใช้ซอฟต์แวร์ของคุณ
Martin Geisler

2
ฉันกำลังคิดตั้งชื่อมัน .hgempty อาจให้เบาะแสที่ดีกว่าสำหรับสิ่งที่มันเป็น
User

6
ใช่หรือ .hgkeep
Natim

2
อาจเป็นไปได้สำหรับ verbose: .hgkeepifempty :)
Daniel Sokolowski

4

ฉันสร้างสคริปต์หลามที่ทำให้กระบวนการสร้าง / ลบไฟล์เหล่านั้นโดยอัตโนมัติ

นี่คือแหล่งที่มาของสคริปต์: 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

จริงอัปเดตลิงค์ ...
mendezcode

2
โฮสต์บน bitbucket (หรือ) GitHub, Pastebin เก่าเก่า
Phyo Arkar Lwin

-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 ไฟล์ที่คุณต้องการเพิ่มโฟลเดอร์ "empty" ในการควบคุมเวอร์ชัน เหตุผลที่กฎนี้มีความสำคัญก็คือไฟล์ใด ๆ ในโฟลเดอร์นั้น (เช่น images/test-image.png จะมีลักษณะเหมือนไฟล์ที่ไม่มีเวอร์ชันใหม่ในของคุณ hg status หากคุณไม่ละเลยรูปแบบนั้น


2
โปรดอ่านคำถามอีกครั้งอย่างระมัดระวัง คำตอบของคุณคือ ไม่ ตอบคำถามเดิมซึ่งถามว่า "วิธีเพิ่มโฟลเดอร์ว่าง" ไม่ใช่ "วิธีเพิกเฉยโฟลเดอร์"
DavidPostill

1
คุณถูก. ฉันได้อัปเดตคำตอบเพื่อตอบคำถามจริง ฉันเปลี่ยนคำแนะนำแล้วทิ้งไว้เพราะมันสำคัญที่ต้องรู้และ 99% ของเวลาที่เป็นพฤติกรรมที่ต้องการ
Paul Redmond

@ PaulRedmond เกิดอะไรขึ้นถ้า images ไดเรกทอรีลึกเข้าไปในเส้นทางคืออะไร? สิ่งที่ต้องการ ./lectures/chapter_10/images? ไวยากรณ์ที่ถูกต้องคืออะไร?
aaragon

@aaragon เป็นที่ยอมรับมานานแล้วตั้งแต่ฉันใช้ Mercurial แต่คุณต้องปรับ regex ให้ตรงกับรูปแบบที่คุณต้องการ เมื่อคุณสังเกตเห็นเส้นทางที่คุณคาดว่าจะถูกเพิกเฉยให้ปรับ regex ตามต้องการ
Paul Redmond
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.