空のディレクトリに.gitkeepを配置するコマンドラインツール


SubversionからGitに移行する過程で、空のディレクトリをリポジトリに追加するのを忘れないようにしないといけません。Gitは空のディレクトリはバージョン管理しないので、何らかのファイルを置く必要があります。何らかのファイルは.gitignoreemptyなどありますが、個人的にはRails風に.gitkeepを置くようにしています。

基本的には、find . -type d -name .git -prune -o -type d -empty -exec touch {}/.gitkeep \; を実行すればOKです。今回は作ったツールは、.gitkeepを配置する前にどのディレクトリが空っぽか確認する機能や、このコマンドの.gitkeep部分を指定できたりなど、オプショナルな機能を追加したものです。

使い方

空っぽのディレクトリ一覧を出す:

cd git-repo
git-empty-dir list

空っぽのディレクトリに.gitkeepを配置する:

cd git-repo
git-empty-dir keep

他にも--dir--keeperなどのオプションがあります。

$ git-empty-dir keep --help
usage: git-empty-dir keep [-h] [--dir DIR] [--keeper KEEPER]

optional arguments:
  -h, --help       show this help message and exit
  --dir DIR        path to git directory
  --keeper KEEPER  dummy file name. Default is ".gitkeep"

git-empry-dir.py

git-empry-dir.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import argparse
import commands
import sys

def list(args):
    command = "find %(dir)s -type d -name .git -prune -o -type d -empty" % vars(args)
    result = commands.getstatusoutput(command)
    print result[1]
    if result[0] > 0:
        sys.exit(1)

def keep(args):
    command = "find %(dir)s -type d -name .git -prune -o -type d -empty -exec touch {}/%(keeper)s \;" % vars(args)
    result = commands.getstatusoutput(command)
    print result[1]
    if result[0] > 0:
        sys.exit(1)

def check_git_dir(dir):
    git_dir = dir + '/.git'
    if os.path.isdir(git_dir) == False or os.path.islink(git_dir) == True:
        print 'Not found .git in ' + dir
        sys.exit(1)

def main():
    parser = argparse.ArgumentParser(description='Add .gitkeep to empty directories.')

    subparsers = parser.add_subparsers(title='commands', metavar='command')

    parser_list = subparsers.add_parser('list', help='list candidates')
    parser_list.set_defaults(func=list)
    parser_list.add_argument('--dir', type=str, help='path to git directory', default=os.getcwd())

    parser_keep = subparsers.add_parser('keep', help='')
    parser_keep.set_defaults(func=keep)
    parser_keep.add_argument('--dir', type=str, help='path to git directory', default=os.getcwd())
    parser_keep.add_argument('--keeper', type=str, help='dummy file name. Default is ".gitkeep"', default='.gitkeep')

    args = parser.parse_args()
    args.dir = args.dir.rstrip('/')

    check_git_dir(args.dir)

    args.func(args)

if __name__ == "__main__":
    main()

Pythonの argparse って便利ですね!

[2012-04-05 11:55] .git がないところでうっかり keep してしまって悲惨なことになったので、.gitがあるかをチェックするようにした