Hatena::Groupsubtech

NaN days

ブログを移転しています。最新の記事は motemen.hatenablog.com へどうぞ

2013-02-07

GitHub のリポジトリを管理する小さいツール ghq

| 13:14 | GitHub のリポジトリを管理する小さいツール ghq - NaN days を含むブックマーク はてなブックマーク - GitHub のリポジトリを管理する小さいツール ghq - NaN days

この記事は古いです。お探しなのghq: リモートリポジトリのローカルクローンをシンプルに管理する - 詩と創作・思索のひろば の方かもしれません。

GitHub 上の面白そうなコードは手元に clone してから見るのが普通だと思いますがそれをこんな感じに整理してます。

  • ~/extrepo/@author/project に git clone する(~/extrepo/@motemen/ghq とか)
  • ~/extrepo/project からそこに symlink する(~/extrepo/ghq → ~/extrepo/@motemen/ghq

こうすると ~/extrepo/jquery などでアクセスできて楽です。「あの人のあのプロダクト」って思い出し方をしたいときには ~/extrepo/@motemen を辿っていけばよい。

tree するとこんな感じです。

.
|-- @cho45
|   |-- Config-ENV
:
|   |-- jsdeferred
|   `-- starter.pl
|-- @cloudhead
|   |-- http-console
|   `-- less.js
:
|-- Brownie -> @masaki/Brownie
|-- Class-Accessor-Lite -> @kazuho/p5-Class-Accessor-Lite
:
|-- webiblo -> @mizzy/webiblo
`-- ws -> @einaros/ws

ghq

そしてこれを簡単に行うためのオレオレツールghq です。以下のようにして使えます。

clone する
% ghq [-clone] https://github.com/motemen/polka

のようにすると ~/extrepo/@motemen/polka に git clone されて先に伸べたようなシンボリックリンクが作られます。

ディレクトリへ移動する
% ghq [-cd] polka

または

% ghq [-cd] @motemen/polka

とするとそのディレクトリへ cd します。

インストール

zshスクリプトで書いてます。

% git clone git://github.com/motemen/ghq.git ghq_dir

したのち

fpath=(ghq_dir/zsh $fpath)
autoload -U ghq
autoload -U compinit; compinit

と .zshrc に書くと、ghq というコマンドと補完(-cd したときなど)が有効になります。clone 先のルートディレクトリgit config ghq.root で変更できます(たぶん)。

あとすでに同名のリポジトリが存在しているときは remote に追加するようにしてみたんだけどそれは余計なお世話だったかもしれない……。

2009-01-21

シェルのプロンプトにgit「ブランチ」を表示するやつ

| 16:49 | シェルのプロンプトにgit「ブランチ」を表示するやつ - NaN days を含むブックマーク はてなブックマーク - シェルのプロンプトにgit「ブランチ」を表示するやつ - NaN days

while (”im mirrored”); が rebase とか merge とかの状態わかって非常に便利なのでコピペさせてもらってます。それのオレ流かいぞう。REBASE (2/5) みたいな進み具合もだしてみる (これであってるかどうかは分からない)。

f:id:motemen:20090120191305p:image

# http://d.hatena.ne.jp/ka-nacht/20090112/1231746120
function _echo_git_head() {
    local git_dir="$(/usr/local/bin/git rev-parse --git-dir 2>/dev/null)"
    if [ -z "$git_dir" ]; then
        return 1
    fi

    local head_name=''
    local additional_info=''
    if [ -d "$git_dir/rebase-apply" ]; then
        if [ -f "$git_dir/rebase-apply/rebasing" ]; then
            additional_info="REBASE"
        elif [ -f "$git_dir/rebase-apply/applying" ]; then
            additional_info="AM"
        else
            additional_info="AM/REBASE"
        fi

        local next="$(< "$git_dir/rebase-apply/next")"
        local last="$(< "$git_dir/rebase-apply/last")"

        if [ "$next" -a "$last" ]; then
            next=$[ $next - 1]
            additional_info="$additional_info ($next/$last)"
        fi

        head_name="$(/usr/local/bin/git symbolic-ref HEAD 2>/dev/null)"
    elif [ -d "$git_dir/rebase-merge" ]; then
        if [ -f "$git_dir/rebase-merge/interactive" ]; then
            additional_info="REBASE-i"
            head_name="$(< "$git_dir/rebase-merge/head-name")"
            local left="$(grep '^[pes]' $git_dir/rebase-merge/git-rebase-todo | wc -l)"
            if [ "$left" ]; then
                left=$[ $left + 1 ]
                additional_info="$additional_info ($left left)"
            fi
        else
            additional_info="REBASE-m"
            head_name="$(< "$git_dir/rebase-merge/head-name")"
        fi
    elif [ -f "$git_dir/MERGE_HEAD" ]; then
        additional_info="MERGING"
        head_name="$(/usr/local/bin/git symbolic-ref HEAD 2>/dev/null)"
    else
        head_name="$(/usr/local/bin/git symbolic-ref HEAD 2>/dev/null)"
    fi

    if [ -z "$head_name" ]; then
        head_name="$(/usr/local/bin/git branch | sed -e 's/^\* //;t;d')"
        if [ "$head_name" = '(no branch)' ]; then
            # "git branch" doesn't show the correct name of a branch after
            # "git checkout {commitish-and-not-the-head-of-a-branch}",
            # so we have to use another method to get the name of {commitish}.
            head_name="$(
            {
                fgrep 'checkout: moving from ' .git/logs/HEAD |
                sed '$s/^.* to \([^ ]*\)$/\1/;t;d'
            } 2>/dev/null
            )"
        elif [ "$head_name" = '' ]; then
            head_name='(just initialized; nothing commited)'
        fi
    fi

    head_name="${head_name##refs/heads/}"

    if [ -n "$additional_info" ]; then

        additional_info=", $additional_info"
    fi

    echo "$head_name$additional_info"

    return 0
}

メモ

  • 変数代入の = の前にスペース入れちゃだめ