Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
76
Help us understand the problem. What is going on with this article?
@yuya_presto

1つのgitリポジトリに複数の作業ディレクトリを作る

More than 5 years have passed since last update.

(commit or stash + checkoutすらめんどいことだって、あるんですよ・・)

そもそもリポジトリと作業ディレクトリの違いって?

gitリポジトリには、コミットされている内容やブランチなどの全ての情報がつまっています。一方で作業ディレクトリは、リポジトリ内のあるcommitの内容を、ファイルとして書き出したものになっています。

git-new-workdirコマンド

gitリポジトリに紐づく新たな作業ディレクトリを作成します。

git-new-workdir <repository> <new_workdir> [<branch>]

ただし、デフォルトでPATHが通っていません。Fedoraあたりなら /usr/share/doc/git-1.7.10.2/contrib/workdir/git-new-workdir に、homebrewなら /usr/local/Cellar/git/1.7.12.4/share/git-core/contrib/workdir/git-new-workdir あたりに入っているかと思われます(バージョンは適宜読み替えてください)。その他gitがインストールされている環境であれば、locateや/usr以下へのfind -nameで見つけられると思います。

それってgitリポジトリをコピペするのと何が違うの?

  • branchの状態が共有されます。すなわち、ある作業ディレクトリでcommitをすると、他の作業ディレクトリからも参照できます。
  • git pullやgit fetch、git remote updateなどで取得した情報は共有されます。
  • ブランチ固有のconfig(.git/config)が共有されます。
  • (hookなども共有されると思います。)

作業ディレクトリがいくつもあって何がうれしいの?

  • 別々のbranchを同時にcheckoutして、動作の比較を行ったりできます。
  • 急なバグ対応が入ったりした時に、面倒なcommitやstashをせずに、すぐに作業を切り替えることができます。
  • (個人的に)作業状態のまま放置できるので、どの作業をしていたのか忘れずに済みます。

注意したい点

  • index/staging領域(git addすると追加されるところ)は共有されません
    • すなわち、ある作業ディレクトリからgit addしただけの差分は、他の作業ディレクトリから参照できません
  • ある作業ディレクトリでcheckoutしているブランチを、別の作業ディレクトリから更新(commitやreset HEAD~、pullなど)してしまうと、おかしなことになります。
    • git statusすると、checkoutしていたツリーがgit addされていることがわかります(indexがそのままに、commitだけが変わったため)。
    • まだgit addしていない変更内容が巻き添えになったときは、同じファイルが変更されていない限り、git reset --mergeするとだいたい元に戻るかと思いますが、保証はありません。
  • checkout中のbranchを他の作業ディレクトリから消してしまうと、その作業ディレクトリではcheckoutすらできなくなってしまいます。
    • git reset --hard <どこか> としてブランチを再度初期化し、改めてブランチを消してください
  • シンボリックリンクを使っているので、repositoryとしてgit-new-workdirで作成したディレクトリを渡すと、symlinkに対するsymlinkが作成されておかしくなるかもしれません。

※使っていない作業ディレクトリのファイル容量が気になる時は、ファイルをすべてgit rmしたparking branchを作成して、checkoutしておくとよさそうです。
※作業ディレクトリ数に制限はありません。

参考

Qiitaのこの記事でも取り上げられていました。
http://qiita.com/items/2a19f5dca568329f8f8e

76
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
yuya_presto
[a.k.a. ypresto] Android StudioとXcodeを同時起動しながらAtomでRubyとかES6とか書きつつgitでmergeしてpushする日々。
codetakt
学習管理システム「schoolTakt」を運営するEdTechのスタートアップ企業

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
76
Help us understand the problem. What is going on with this article?