Git 覚え書(ほぼ自分用：時々更新)

gitは日常的に使ってますが、使用頻度が低いコマンドはすぐ忘れてしまうので自分用のメモをここに残しています。
（時々更新予定）

## プロジェクト作成

```console:
$ cd プロジェクトのdir
$ git init

```

## ファイル追加

```console:
$ git add 追加したいファイル
$ git add .    # 全部追加できる
```

空のディレクトリは追加できないので、よくディレクトリに適当な.gitnoteなどの空ファイルを作るパターンが多いです。

## ユーザ名とメールアドレスの設定関連

ユーザ名とメールアドレスはシステム全体で自動的に設定されるグローバルと、そのプロジェクトのみで使用できるローカルの二種類が設定可能。

多少面倒でもグローバルには誰が見ても当たりさわりのないものを設定しておいて、ローカルで個々のを設定しておくと<b>あらぬ事故を防げて</b>お得です。


```console:
# グローバル設定
$ git config --global user.name ユーザ名
$ git config --global user.email メールアドレス

# ローカル設定
$ git config --local user.name ユーザ名
$ git config --local user.email メールアドレス

# 確認
$ git config --list


```

##gitに無視させたいファイルがある

.gitignoreファイルを作って、その中に無視させたいファイルを書けばOK。

```bash:.gitignore

*.o
out/

```

ワイルドカードも使用可能で、↑の例では、ほげほげ.oファイルすべてとoutディレクトリのみが無視される
(outディレクトリの中にあるファイルは無視されない)

プロジェクトごとにわざわざ書くのが面倒な場合は、以下に各言語のテンプレートがあるので、ここからテンプレートを持ってくると便利です。
https://github.com/github/gitignore


##プロジェクトを.git抜きでエクスポートしたい

.git抜きでエクスポートする場合は以下のようにする

```console:
$ git archive --format=tar.gz ブランチorタグor番号 -o 出力ファイル名

# ↑の場合はカレントの位置を基準としたアーカイブを作成
# してしまうので、特定のディレクトリの中に収めたい場合はこれ

$ git archive --format=tar.gz -prefix=ディレクトリ名/ ブランチorタグor番号 -o 出力ファイル名

```

git checkout-indexも似たようなことができますが、使用方法を間違えると危ないのでよほどのことが無い限りgit archiveで運用したほうがいいです。


##別のリポジトリの変更点を反映したい(変更履歴付きで)

まず、別のリポジトリの差分をgit format-patch でパッチを作る

```console:
$ git format-patch ブランチorタグor番号 

```

すると、00XX-xxxx.patchというファイルができるので、これらを反映したいリポジトリにコピーする。
その後、git am で適用するとOK

```console:
$ git am パッチファイル名 

```

失敗するとなにか言われるので、git am --abortとかすると取り消せる。
abortで取り消したあとで、patchファイルを編集して再度git amしてもいい。





##プロキシ設定

イントラネットなどでプロキシが設定されていることは当たり前なので、外部に接続する時はやっておくと吉

```console:
$ git config --global http.proxy プロキシサーバのアドレス:ポート番号
```

## github色々

ローカルで新規にリポジトリを作る場合は、Github上で新規に作ったあと以下のようにする。

```console:
$ cd プロジェクト名
$ git init
$ git config --local user.name ユーザ名
$ git config --local user.email メールアドレス
$ git config --local github.user githubユーザ名
$ git config --local github.token github APIキー
$ git remote add origin git@github.com:ユーザ名/リポジトリ名.git
$ git fetch
$ git checkout master

```

リモートへの反映は次のようにやる

```console:
$ git commit -a -m コミットメッセージ
$ git push origin master

```
(master以外を指定するとそのブランチがリモートにも作成される。既にある場合そのブランチがアップデートされる)


リモートからの反映は次のようにやる(remoteのbranchに注意)

```console:
$ git fetch
$ git merge origin/master

```



##Windowsでgitgitしたい

windowsでGitしてブランチ作って管理したいと思うことってありませんか？
私はwindowsでしか動かないツールも扱うことが多いので、結構あります。

で、Windows上でのgitは、前は面倒だったり動作に問題がありましたが今は結構使えるようになってます。
GUI派はsourcetree落としておくと何かと便利。

gitで作ったプロジェクトがsambaで接続されたUNC形式なパスでも問題なく操作できて、クロス開発がやりやすいです。
日本語も化けないのは有能。

余談ですが、Visual Studio 2013ではgitが普通に使えるらしい。。
これはもうVSSなんか窓からなげすt。。。

2012は別途Extensionを入れるとOK

msysgit 
http://msysgit.github.io/

sourcetree
http://www.sourcetreeapp.com/download/

Visual Studio Tools for Git
http://visualstudiogallery.msdn.microsoft.com/abafc7d6-dcaa-40f4-8a5e-d6724bdb980c


インストールの流れとしては
msysgit→sourcetreeの順番だけど、sourcetreeは内部的にgitを持ってるので、sourcetree単体でも問題ないかもしれません。

msysgitのインストール時に`Run Git and included Unix tools from the Windows Command Prompt`を選択するとcmdでgitが普通に使えるようになるので何かと捗ります。



##gitoliteでプライベートなGitサーバの管理

プライベートなGitサーバを作るときに結構便利


###パッケージ導入

```console:
$ sudo apt-get install gitolite

```

Warinigが出ることがあるけど大丈夫



###gitoliteユーザの作成

管理はgitoliteにやらせましょうということでユーザ作成

```console:
$ sudo adduser --system --disabled-password --shell /bin/sh --group gitolite --home /var/gitolite
```
home は別に　/home/gitolite　でも構わないみたいです。


###管理者の設定

gitoliteを管理するユーザを設定します。
gitoliteはRSA公開鍵を使ってユーザ管理をやります。

なので、今使っているrsaの鍵とは違う鍵を使いたい場合は次のようにします。

```console:
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa) ←　ここに新しいファイル名を追記すること
```

で、新しく作った公開鍵の名前をid_rsa_admin_gitとすると。。

```console:
sudo -H -u gitolite gl-setup ~/.ssh/id_rsa_admin_git.pub
```
とするとOK
しばらくするとコンフィグ設定をするためにエディタが起動するけど、今はなにもしなくてそのままエディタを終われば良い。


###sshのconfigを編集

sshのconfigを編集して先ほど設定したアドミン用の鍵を使わせるようにする。
~/.ssh/configを次のように編集

```console:
host my_gitserver
    user gitolite
    hostname 192.168.1.100（Gitサーバのホスト名かIP）
    port 22
    identityfile ~/.ssh/id_rsa_admin_git
```

終わったらCloneできるかどうか確認。

```console:
$ cd 適当なディレクトリ
$ git clone ssh://my_gitserver/testing
```


### リポジトリの基本的な動作

このへんはほとんどgithub使う時と変わらない感じです。
sshのconfigにサーバ接続情報が書いていれば以下でOK

```console:
$ git clone ssh://my_gitserver/testing
```

リモードへの変更反映
```console:
$ git push origin master
```

リモードからの変更を取得
```console:
$ git pull
```

### 新しいユーザの追加

##### [ユーザ側] 
管理者を作った時のように、sshの公開鍵を作成。

```console:
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa) ←　ここに新しいファイル名を追記すること
```

で、新しく作った公開鍵の名前をid_rsa_user_gitとして、~/.ssh/configを以下のようにする。

```console:
host linux_gitserver
    user gitolite
    hostname 192.168.1.100（Gitサーバのホスト名かIP）
    port 22
    identityfile ~/.ssh/id_rsa_user_git
```

終わったら、id_rsa_user_git.pub(公開鍵)をgitサーバの管理者に渡す。

#####[管理者側]

ユーザから公開鍵を受け取ったら、gitoliteにユーザの鍵を追加する必要があるのですが、gitoliteはgitでユーザ情報もかんりしているので、管理情報をgitからクローンしてきます。

```console:
git clone ssh://my_gitserver/gitolite-admin
```

これで、gitolite-admin以下に[conf]と[keydir]ができるので、keydirのほうにもらった公開鍵をコピーしてpushすればOK


```console:
cp もらった公開鍵 gitolite-admin/keydir/ユーザ名.pub
git add keydir/ユーザ名.pub
git commit -a -m "user add hogehoge"
git push
```

#####[ユーザ側]

管理者が追加したら、以下で確認。

```console:
$ cd  hogehoge
$ git clone ssh://linux_gitserver/testing
```



### 新しいリポジトリの作成

先ほど作ったgitolite-adminレポジトリのconfにある[gitolite.conf]を次のように追記すればOK。

```console:
repo    [新しいレポジトリ名]
                RW+             =       [許可したいユーザ名]

```

これをgit commit git push するだけでOK
ユーザ名はもらった公開鍵の.pubを抜いた名前となるので注意。


### 現在進行中のローカルリポジトリを丸々リモートに反映する

```console:
git remote add origin <SSHの位置>
git push origin --all

```

で全ブランチが反映されます。


### gitoliteからリポジトリを削除する

gitolite-adminレポジトリのconfにある[gitolite.conf]にあるリポジトリの記述を削除したあとで、いつものように

```console:
git commit -a -m "delete xxx repo"
git push origin master

```
として反映すればとりあえず消えますが、gitoliteサーバにデータがまだ残ってるので、gitoliteサーバに入ってデータを削除する必要があります

```console:
sudp su - gitolite
cd repositories
rm -rf <消したいレポジトリ>.git
```