目次
作業ディレクトリのあるノンベアリポジトリを作成
記録したいファイルがあるディレクトリに対して
1 |
git init |
のコマンドをすることでリポジトリを作成できます。
1 2 3 4 |
~/TestProject$ git init Initialized empty Git repository in /home/ubuntu/TestProject/.git/ ~/TestProject (master) $ ls -AF .git/ file1.txt file2.txt file3.txt |
リポジトリを作成するとその中に.gitというディレクトリが作成されます。
ノンベアリポジトリの補足(.gitの内容を少し確認)
.gitディレクトリにはGitの子のリポジトリに対しての設定やコミットされた内容が記録されていきます。
これはノンベアリポジトリであり、基本的にローカルリポジトリとして利用されます。詳しい説明は行いませんが、この.gitリポジトリを一階層下までみると以下のような感じになっています。
1 2 3 4 5 6 7 8 9 10 11 12 |
~/TestProject (master) $ tree -L 1 .git/ .git/ ├── HEAD ├── branches ├── config ├── description ├── hooks ├── info ├── objects └── refs 5 directories, 3 files |
Git用のプロンプト文字列は__git_ps1という関数を利用するとディレクトリがGitリポジトリの時にGit用の情報が表示されるようなプロンプト文字列を生成できます。コマンド例のプロンプト文字列は
1 |
PS1="\w"'$(__git_ps1 " (%s)") \$ ' |
を利用したいと思います。ディレクトリとブランチ名が表示されます。色設定は行っていません。
作業ディレクトリのないベアリポジトリを作成
ベアリポジトリ(bare repository)はGitサーバーとして利用できます。また、リモートリポジトリとしても利用できます。
リモートリポジトリとして利用できるプロトコルは以下のものがあります。
- Localプロトコル
- HTTPプロトコル
- SSHプロトコル
- Gitプロトコル
このGitの記事では基本的にLocalプロトコルでリモートリポジトリを扱っていきます。LocalプロトコルはNFS(Network File System)などを利用したり、ディスクを分けて利用すると都合がよいプロトコルになります。
ベアリポジトリを作成するコマンドは、ベアリポジトリの書き込み権限を考えて以下のようになります。
1 |
git init --bare --shared |
ベアリポジトリのディレクトリは.gitの拡張子をつけたディレクトリが慣習的で、ベアリポジトリを作成するgit initコマンドを入力すると
1 2 3 4 |
~/git/TestProject.git $ git init --bare --shared Initialized empty shared Git repository in /home/ubuntu/git/TestProject.git/ ~/git/TestProject.git (BARE:master) $ ls -AF HEAD branches/ config description hooks/ info/ objects/ refs/ |
ノンベアリポジトリの.gitの中身がそのまま展開されたようにファイルやディレクトリが作成されます。
ここで権限を見てみると
1 2 3 4 5 6 7 8 9 10 |
~/git/TestProject.git (BARE:master) $ ls -Al 合計 32 -rw-rw-r-- 1 ubuntu ubuntu 23 3月 7 09:57 HEAD drwxrwsr-x 2 ubuntu ubuntu 4096 3月 7 09:57 branches -rw-rw-r-- 1 ubuntu ubuntu 126 3月 7 09:57 config -rw-rw-r-- 1 ubuntu ubuntu 73 3月 7 09:57 description drwxrwsr-x 2 ubuntu ubuntu 4096 3月 7 09:57 hooks drwxrwsr-x 2 ubuntu ubuntu 4096 3月 7 09:57 info drwxrwsr-x 4 ubuntu ubuntu 4096 3月 7 09:57 objects drwxrwsr-x 4 ubuntu ubuntu 4096 3月 7 09:57 refs |
775で同じグループはそれぞれの権限がありますが、その他のユーザには書き込み権限がありません。書き込み権限がないとpushコマンドでリモートリポジトリを更新できません。
また、グループについているsは実行権限がありセットGIDが設定されていることを表します。セットGIDはディレクトリにつく場合はファイル作成時の所有者のグループが親ディレクトリと同じになりまず。ディレクトリ内のファイルが一貫して特定の所有者が持つことになり、共有ディレクトリ等で利用されます。
--sharedオプションがない場合はumaskで設定されている権限になります。また、別の権限を設定したい場合はファイル権限特有の8進数での指定もあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
~/git $ mkdir MyPrivateBareRepos.git ~/git $ cd MyPrivateBareRepos.git/ ~/git/MyPrivateBareRepos.git $ git init --bare --shared="0700" Initialized empty shared Git repository in /home/ubuntu/git/MyPrivateBareRepos.git/ ~/git/MyPrivateBareRepos.git (BARE:master) $ ls -Al 合計 32 -rw------- 1 ubuntu ubuntu 23 3月 7 10:02 HEAD drwx--S--- 2 ubuntu ubuntu 4096 3月 7 10:02 branches -rw------- 1 ubuntu ubuntu 129 3月 7 10:02 config -rw------- 1 ubuntu ubuntu 73 3月 7 10:02 description drwx--S--- 2 ubuntu ubuntu 4096 3月 7 10:02 hooks drwx--S--- 2 ubuntu ubuntu 4096 3月 7 10:02 info drwx--S--- 4 ubuntu ubuntu 4096 3月 7 10:02 objects drwx--S--- 4 ubuntu ubuntu 4096 3月 7 10:02 refs |
グループにあるSはセットGIDがありますが実行権限がないことを表します。
ベアリポジトリへの移行
既存のノンベアリポジトリをベアリポジトリに移行やベアリポジトリを別のベアリポジトリへ移行する方法は色々あります。
例えば、
- 空のベアリポジトリを作成
- 移行したいリポジトリをベアリポジトリでクローン(これは一時的なリポジトリとして利用)
- クローンしたリポジトリに移動してpush --mirrorで空のリポジトリへプッシュ
- 一時的なリポジトリを削除
のような手順で移行できます。
例えば、ノンベアリポジトリをベアリポジトリへ移行したい場合、この手順は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
~ $ cd git ~/git $ git init --bare --shared to.git Initialized empty shared Git repository in /home/ubuntu/git/to.git/ ~/git $ cd .. ~ $ ~ $ git clone --bare from/.git tmp.git Cloning into bare repository 'tmp.git'... done. ~ $ ~ $ cd tmp.git/ ~/tmp.git (BARE:master) $ git push --mirror ~/git/to.git Enumerating objects: 3, done. Counting objects: 100% (3/3), done. Delta compression using up to 2 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 208 bytes | 69.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 To /home/ubuntu/git/to.git * [new branch] master -> master ~/tmp.git (BARE:master) $ ~/tmp.git (BARE:master) $ cd .. ~ $ rm -rf tmp.git ~ $ |
空のリポジトリの作成はGithubやGitLab等のホスティングサービスを利用する場合はホスティングサービスの方で行うので必要ないかもしれません。また、この例ではLocalプロトコルのため、from/.gitやto.gitはファイルパスを利用していますが、これはURLに変えても利用できるでしょう。冗長な例かもしれませんが、URLっぽくするためにGitではおそらくあまり使わないfile://の形式でも例を示します。file://の形式やノンベアリポジトリからベアリポジトリの例のため少し違和感があるかもしれませんがご了承ください。
また、コマンドは手順を上のものと合わせるため、一行で表したものを使ってみます。下の例でコマンドを'(コマンド)'のように括弧で囲んだのはサブシェルで動かしてディレクトリ移動で元に戻るコマンドを省略するためのものになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
~ $ git init --bare --shared git/to.git Initialized empty shared Git repository in /home/ubuntu/git/to.git/ ~ $ ~ $ git clone --bare 'file:///home/ubuntu/from/.git' tmp.git Cloning into bare repository 'tmp.git'... remote: Enumerating objects: 3, done. remote: Counting objects: 100% (3/3), done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 Receiving objects: 100% (3/3), done. ~ $ ~ $ ( cd tmp.git ; git push --mirror 'file:///home/ubuntu/git/to.git' ) Enumerating objects: 3, done. Counting objects: 100% (3/3), done. Delta compression using up to 2 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 208 bytes | 208.00 KiB/s, done. Total 3 (delta 0), reused 3 (delta 0), pack-reused 0 To file:///home/ubuntu/git/to.git * [new branch] master -> master ~ $ ~ $ rm -rf tmp.git |
リポジトリをクローン
リポジトリのクローン(clone)はベアリポジトリでもノンベアリポジトリでも利用できます。
基本的に利用する場合は、ベアリポジトリに対してクローンを行います。
クローンのコマンドは
1 |
git clone <リポジトリのURL or ファイルパス名> [<ディレクトリ名>] |
になります。cloneコマンドを利用する場合は基本的にURLを指定すると思いますが、Localプロトコルを利用する場合はファイルパス名になります。
git cloneコマンドを使ってみます。
1 2 3 4 5 6 7 8 |
~/clones $ git clone ~/git/TestProject.git Cloning into 'TestProject'... warning: You appear to have cloned an empty repository. done. ~/clones $ ls -AF TestProject/ ~/clones $ ls -AF TestProject/ .git/ |
今回は空のリポジトリをクローンしたので、少し注意を受けましたがリポジトリをクローン出来ました。
次にクローン時にディレクトリを指定した例を示します。
1 2 3 4 5 6 7 8 9 |
~/clones $ mkdir TestProjectClone ~/clones $ git clone ~/git/TestProject.git TestProjectClone Cloning into 'TestProjectClone'... warning: You appear to have cloned an empty repository. done. ~/clones $ ls -AF TestProject/ TestProjectClone/ ~/clones $ ls -AF TestProjectClone/ .git/ |
指定したディレクトリの中に.gitディレクトリが作成されるような感じでリポジトリがクローンされます。
(補足)デフォルトのブランチ名を設定
Gitでリポジトリを初期化したときに以下のようなメッセージが表示されました。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ git init hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch <name> hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m <name> Initialized empty Git repository in /home/ubuntu/TestProject/.git/ |
Gitでのデフォルトのブランチ名を変更できるというメッセージです。設定しなくてもmasterがデフォルトのブランチ名となりますが、ここで以下のようなコマンドでデフォルトのブランチ名を設定すると
1 |
git config --global init.defaultBranch master |
長いメッセージが表示されなくなります。
1 2 3 4 |
~/TestProject$ git init Initialized empty Git repository in /home/ubuntu/TestProject/.git/ ~/TestProject (master)$ ls -AF .git/ file1.txt file2.txt file3.txt |
この設定は人権運動の背景からデフォルトブランチ名をmasterからmainへと変更するという経緯があります(master-slaveの関係でmasterという言葉が問題です)。