nDiki : シェル

シェル - shell

2014年1月29日 (水)

git-new-workdir で複数の Git ブランチをチェックアウトして同時に作業する

Git のトピックブランチ開発している時に、他のブランチを同時にチェックアウトしておきたくなる事がままある。

  1. 割り込みで他の人のコードをレビューするため。
  2. 途中で別の不具合見つけたので、別トピックブランチで先に fix するため。
  3. 複数のブランチ上のファイルをつまみ食い的に Emacs で開いて中を見たりしたいため。
  4. 他の人に使い勝手などを確認してもらうため、あるブランチWeb サーバを起動したいため。

いったんテンポラリコミットを作ったり、あるいは stash したりして作業ツリーを保存してチェックアウトしなおして用事を済ませて元に戻すとかはやるのだけれど、ちょっと面倒。3番目のケースは同時にチェックアウトしたいのでこの方法だと駄目だし、4番目のケースだとしばらくそのままにしておかないのでもっと困る。

そのような時はローカルリポジトリから別ディレクトリへ clone して、そちらをサブで使ったりするんだけれど、サブの方でちょっと修正したりした際にローカル間で push/pull とかしなければならなくてこれまた面倒。

なんかいいのないかなと思ったら Git の contrib に git-new-workdir というのがあるのを昨日知った。

 git-new-workdir . ../sub
 あるいは
 git new-workdir . ../sub

で作業ツリーを新しく作れる。/tmp/git/main を /tmp/git/sub に new-workdir すると sub の方の .git の中は

 drwxr-xr-x 3 naney naney 4096  1月 30 00:37 .
 drwxr-xr-x 3 naney naney 4096  1月 30 00:37 ..
 -rw-r--r-- 1 naney naney   23  1月 30 00:37 HEAD
 lrwxrwxrwx 1 naney naney   25  1月 30 00:37 config -> /tmp/git/main/.git/config
 lrwxrwxrwx 1 naney naney   24  1月 30 00:37 hooks -> /tmp/git/main/.git/hooks
 -rw-r--r-- 1 naney naney  104  1月 30 00:37 index
 lrwxrwxrwx 1 naney naney   23  1月 30 00:37 info -> /tmp/git/main/.git/info
 drwxr-xr-x 2 naney naney 4096  1月 30 00:37 logs
 lrwxrwxrwx 1 naney naney   26  1月 30 00:37 objects -> /tmp/git/main/.git/objects
 lrwxrwxrwx 1 naney naney   30  1月 30 00:37 packed-refs -> /tmp/git/main/.git/packed-refs
 lrwxrwxrwx 1 naney naney   23  1月 30 00:37 refs -> /tmp/git/main/.git/refs
 lrwxrwxrwx 1 naney naney   26  1月 30 00:37 remotes -> /tmp/git/main/.git/remotes
 lrwxrwxrwx 1 naney naney   27  1月 30 00:37 rr-cache -> /tmp/git/main/.git/rr-cache
 lrwxrwxrwx 1 naney naney   22  1月 30 00:37 svn -> /tmp/git/main/.git/svn

のような感じで HEAD と index と logs/HEAD 以外はもとのローカルリポジトリへのシンボリックになっている。なので sub での checkout や index の Git 操作など以外は main の方へ反映されるようになっている。わざわざ push/pull しなくて良いのでこれは楽ちん。もちろん作業ツリーはそれぞれ独立しているので、例えばサブの方で Web サーバを起動しておいたり時間のかかるフルテストを走らせておくとかもできる。

ただ複数チェックアウトして作業していると、気がつくと Emacs で違うほうの作業ツリーのファイルを開いて編集していたりして「あれ? 変更したけれどなぜか反映されない……」とかやっちゃうので(実際やった)ちょっと注意が必要ではある。

git-new-workdir は contrib の中(Debian GNU/Linux sid だと /usr/share/doc/git/contrib/workdir/git-new-workdir)にあるみじかいシェルスクリプトなので適当に PATH の通ったところにコピーして実行権限を設定しておけば OK。

Git はこういうところがカワイイよね。

スポンサード リンク
[ 1月29日全て ]

2014年2月19日 (水)

今日のさえずり: 風呂入って出てきたら、シェル上では perlbrew で別の Perl が動いているのを思い出したとか

2014年02月19日

  • 08:41 “ベル研究所が開発するOS「Plan 9」が新たにGPLv2で公開される | SourceForge.JP Magazine” http://bit.ly/1jPdzy3
  • 09:24 iddy 終了。リンクとか外さないと。 / “【重要なお知らせ】iddyサービス終了のお知らせ | iddy 開発者ブログ” http://bit.ly/1feX5Mf
  • 09:24 7,000円台ぐらいまでで出たら即買ってもいいな。iPad 2 での FaceTime のかわりになる。もし国内で出る事があればもっと高くなるんだろうなぁ。 / “数千円で買えて携帯会社と契約不要の「Skypeスマートフォン...” http://bit.ly/1feX7Uk
  • 09:24 「運営者が飽きた」 / “iddy 終了について補足 | WWW WATCH” http://bit.ly/1m7oLnX
  • 10:35 歌うキーボード ポケット・ミク (大人の科学マガジン特別編集)とな。 http://amzn.to/1bjmkNH
  • 21:25 今作っている機能、テーブル1つで済ませるつもりだったけれど、ゴチャゴチャしてきたのでやっぱり明日分ける。
  • 22:53 “大雨・大用に日本野鳥の会バードウォッチング長靴” http://bit.ly/1cpOp4s
  • 24:29 さてこの Subversion で管理しているコードを Git 管理にするかなととりあえず svn log したら「作業コピーではありません」と出て、あれっと思ってみたら CVS/ というディレクトリが。
  • 24:33 そしてなんでこれ /var/www 以下できちんと動いているのに手動で動かすとモジュール見つからないのって思って風呂入って出てきたら、シェル上では perlbrew で別の Perl が動いているのを思い出したとか。
  • 25:03 “文字列検索コマンド「grep 2.17」リリース | SourceForge.JP Magazine” http://bit.ly/1gVu5sN
  • 25:03 “CSRF対策用トークンの値にセッションIDそのものを使ってもいい時代なんて、そもそも無かった” http://bit.ly/1kXbPTN
[ 2月19日全て ]

2014年4月4日 (金)

tmux でペインでの作業をロギングしておく設定

ターミナルでの作業の内容をファイルに書き出しておきたいことがある。特に SSH で入ったリモートホスト上での作業内容を手間をかけずにローカルホスト上にもってきたいことがよくある。

tmux だと pipe-pane コマンドを使うと各ペインでの作業をパイプでコマンドに送っておけると教えてもらったので設定してみた。

パイプからの送り先のコマンドを用意する

cat でもいいのだけれど自分は日付別に保存したいので以下のようなシェルスクリプトを ~/.dotfiles/bin/log-tmux として作る。

 #!/bin/sh

 DATE=`date "+%Y-%m-%d"`
 LOG_DIR=$HOME/var/tmux/log/$DATE
 LOG_FILE=$LOG_DIR/tmux-$DATE-$1.log
 mkdir -p $LOG_DIR
 tmux display-message "Started logging to $LOG_FILE"
 cat >> $LOG_FILE

~/.tmux.conf にキーバインディングを設定する

~/.tmux.conf に以下を追加。

 #
 # logging
 #
 # C-t C-p (toggle)
 bind-key C-p pipe-pane -o '$HOME/.dotfiles/bin/log-tmux "#S-#I:#W-#P"'

これで prefix*1 + C-p をタイプすると

 ~/var/tmux/log/2014-04-04/tmux-2014-04-0-0:bash-0.log

みたいな感じでファイルが作られてそこに pane に出力された内容が書き出されはじめる。もういちど prefix + C-p すると停止。複数のペインで同時に別のファイルにロギングしておける(それぞれで prefix + C-p をタイプして開始させておく)。

ちなみに #S とかは以下。

  • #S: セッション名
  • #I: 現在のウインドウインデックス
  • #W: 現在のウインドウ名
  • #P: 現在のペインインデックス

保存されたファイルにはエスケープシーケンスなども含まれるので見る時は less -R や lv -c あたりを使うとみやすい。

*1自分は C-t

[ 4月4日全て ]

2014年6月18日 (水)

tmux から PuTTY のタイトルバーのタイトルを設定する

PuTTY のタイトルバーの設定をする方法としてシェル上で printf 使うとかあるけれど tmux 起動していると反映されない。

と思ったら .tmux.conf で

  set-option -g set-titles on

しておくだけでよかった。

これで複数 PuTTY を開いている時に Windows のタスクバー上でセッション名で区別できるようになって楽になった。

[ 6月18日全て ]

2014年10月18日 (土)

スーツを処分したり、テレビの配置替えをしたり【日記】

スーツを処分したり

今の会社では仕事でスーツを着る機会が無くタンスの肥やしになっているので、何着か処分しておくことにした。夏スーツ1着と秋冬スーツ1着処分決定。夏スーツはローテーションできるようにあった同じような2着のうち1着を捨て。秋冬スーツパンツがきつくなっているのを1着処分。

これで持っているのは夏スーツ1・秋冬スーツ2・ブラックスーツ1。とりあえず必要になっても一応対応できるはず。

テレビの配置替えをしたり

ちょっと大きな家財を買おうかなという話になっていて、置く場所を考えるとリビングのテレビを反対側に移動した方が良いかなということになった。ということでホームエレクターのワイヤーシェルフと場所を入れ替えることにした。

かかった時間は予想通り2時間ぐらい。3m のテレビアンテナケーブル(ブルーレイディスクレコーダーを去年買った時に一緒に買い替えた JLS3D-P [アンテナケーブル F型プラグ-F型プラグ 3m])はギリギリとどいた。もう少し動かす事になるならもっと長いのが必要。

思ったより違和感なくすぐ馴染めた。

[ 10月18日全て ]

2015年4月30日 (木)

開発ディレクトリ毎に異なる環境変数を設定するのに direnv を使う

シェルで特定の開発ディレクトリ以下に移動すると自動的に設定ファイルで指定された環境変数を設定し、そのディレクトリから別のディレクトリに移動すると戻してくれる direnv が便利。

https://github.com/zimbatm/direnv

Go開発するのに GOPATH と bin への PATH 追加が面倒だったので導入してみた。

インストール

 git clone https://github.com/zimbatm/direnv
 cd direnv
 make build
 cp -a direnv $HOME/local/bin

なお direnv は Go で書かれているのでソースからビルドするには Go開発環境が必要。

Bash の設定

.bashrc に以下を追加。

 if command -v direnv > /dev/null; then
    eval "$(direnv hook bash)"
 fi

その他のシェルでの設定は https://github.com/zimbatm/direnv 参照。

Go プログラム開発ディレクトリでの設定

 $ cd project_dir
 $ export EDITOR=emacsclient # 次のコマンドで開くエディタ
 $ direnv edit .
   .envrc の編集用にエディタが開くので

   layout go

   と入力して保存。

後は Bash でこのディレクトリ以下(サブディレクトリも含む)に移動するとこの .envrc のあるディレクトリが GOPATH に追加され、また bin ディレクトリが PATH に追加される。便利。

なお direnv edit . しないで直接 .envrc を作った場合は、別途 direnv allow . を実行してこの .envrc を使うことを明示的に許可する必要がある。許可したかどうかは ~/.config/direnv/allow/* に保存される(freedesktop.org の XDG Base Directory Specification っぽくなっているので XDG_CONFIG_HOME 環境変数があれば ~/.config ではなくてその下に保存される)。

その他標準で

  • layout go
  • layout node
  • layout perl
  • layout python
  • layout ruby

などが用意されている。また

 PATH_add bin

のようにして PATH への追加も簡単。

その他コマンドの実行も可能なので開発以外にもいろいろ便利に使える。

[ 4月30日全て ]

2015年12月18日 (金)

今日のさえずり: 社内で、宇宙村知っている方にまた声をかけられました

2015年12月18日

  • 19:14 帰宅支援グッズは避難訓練のたびに装着してみているので比較的綺麗です。
  • 19:20 社内で、宇宙村知っている方にまた声をかけられました。宇宙パワーシールも買ったとか。弊社、隕石パワーありすぎ。
  • 20:43 ポビドンヨードで乗り切ります。
  • 21:56 素晴らしい。 / “日清はなぜ10分どん兵衛を作らなかったのか” http://bit.ly/1RWnNMM
  • 21:56鮫洲にギャラリー「アートンシェルター」 ホステルとカフェを併設 - 品川経済新聞http://bit.ly/1RWnMbU
[ 12月18日全て ]

2017年5月16日 (火)

リモートホストのログインシェルzshEmacsTRAMP がハングアップ

これから利用する開発環境にログインしたら Emacs が入ってなかったので「とりあえず TRAMP を使うかと」とローカルホストの Emacs からファイルを開こうとしました。しかしホスト名の後の : をタイプしたところで止まってしまいます。

ちょっと調べてみたところリモートホストのログインシェルzsh のせいでした。

EmacsWiki の https://www.emacswiki.org/emacs/TrampMode を参考にリモートホストの ~/.zshrc の末尾に以下を追加し、TRAMP が正しく動くようにしました。

 if [[ "$TERM" == "dumb" ]]
 then
   unsetopt zle
   unsetopt prompt_cr
   unsetopt prompt_subst
   unfunction precmd
   unfunction preexec
   PS1='$ '
 fi

デフォルトのログインシェルBash がいいなぁ。

[ 5月16日全て ]

2017年8月9日 (水)

何もコミットしないスプリントで各自好きなことをして得られたもの

「プロダクトバックログアイテムについては何もコミットしない」で各自好きなことをして良い1週間スプリントが終わったのでチームでふりかえりました。

何をやらなかったか?

何をやったか?

このチームが自主的に決めたワーキングアグリーメント(記事)に

スプリントゴールが全て達成された場合は、優先する割り込みタスクがあれば対応し、そうでなければ準備完了になっていないプロダクトバックログアイテム(PBI)に関する情報収集・まとめを優先度の高いものからしよう。」

というのがあり、この活動をしていたメンバが多かったです。「スプリントバックログが空 = ただちにスプリントゴールが達成されたので PBI の準備に取り組んだ」わけですね。

環境整備にあてたりとかはあまり多くなかったようです。シェルの設定見直しをしたエンジニアは「失敗したら1日潰れてしまいそうで普段やれなかったことをできた」とやって良かったと言っておりました。

どう感じたか?

開発メンバからは以下のような意見が出ました。

得られた気付きは?

  • タイムボックスの良さにあらためて気付いた(期日から逆算していつまでに何をやるということを考えやすい)。
  • 複数人で作業を見積もることで自信が得られることに気が付いた。

自由になったことで、普段やっているアクティビティの良さを再認識できたようです。チームが取り組んでいるプロダクトの状況から考えるとスクラムではなくカンバンの方が進めやすいのかもしれないのではと私は考えていたのですが、今回の取り組みで開発メンバは「スクラムで続けたい」と改めて思ったとのことです。

スクラムの基本からは外れる取り組みではありましたが、基本通りにやっていたのでは感じ考えることのことができないことを得られたという意味では非常に有意義な1週間でした。

[ 8月9日全て ]

2017年8月24日 (木)

Alfred から一発で日時ファイル名のファイルを新規作成し Ulysses で開けるようにする

Mac ではもっぱらライティングアプリ Ulyssesノートをとっています。さっとメモをする時はあとで整理しやすいように日時がファイル名になっているファイル(シート)をぱっと新規作成して開きたいなと思っていたので方法を調べてみました。

x-callback-url が使える

UlyssesMac アプリケーションでも iOS アプリと同様に x-callback-url に対応しているようなのでこれを使うことにしました。

ターミナルで

 open ulysses://x-callback-url/new-sheet?group=/home/workspace/note\&index=1000\&text=`date +@:%Y-%m-%d-%H%M%S`

とすると外部フォルダ home の中の workspace/note の中に今の日時に合わせて 2017-08-24-130102.md のようなファイルが作成され、 Ulysses がアクティブになりそのシートが開いた状態になります。便利。

ちなみに Ulysses の外部フォルダ上のシートを新規作成して開くなら、同様の日時ファイル名テキストファイルを作成し

 open -a UlyssesMac ファイル名

で開くようなスクリプトを書くのでも OK です。

Alfred から呼べるようにする

動作することがわかったので Alfred 3 for Mac から呼び出せるようにしました。

今日 Alfred を初めて入れてみたので workflow などの機能については良くわかっていません。まずは先のコマンド実行をアプリケーションにして Alfred から呼日出せるようにします。

アプリケーションを作る

  1. Automator を起動
  2. 新規ワークフローを作成
  3. シェルスクリプト実行」アクションを右のペインにドラッグ&ドロップ
  4. シェルスクリプトとして前述の1行コマンドを入力
  5. 右上の実行ボタンを押して動作することを確認
  6. フォーマットに「アプリケーション」選択し ~/local/Applications/new-note.app として保存(Alfred の初期設定ではホームディレクトリ以下ならどこでも OK)

これで option + shift で Alfred を表示したあとに new-note と入れて実行するれば、新しい日時ファイル名のファイルが作成されて Ulysses 上でシートが開いた状態になります。

これで Ulysses でさっとメモを取るのが一気に楽になりました。

[ 8月24日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィでマネージャー・プロダクトオーナーをしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

follow us in feedly

※内容は個人的見解であり所属組織とは関係ありません。

月別インデックス
Process Time: 0.248978s / load averages: 0.75, 0.63, 0.53
nDiki by WATANABE Yoshimasa (Naney, Google profile)
Powered by DiKicker