→まとめ
個人PCで作業を行なう場合でも,大切なファイル(ディレクトリ)は リモートリポジトリにマスターファイルを置き,つねに同期を取りながら バックアップのある状態で作業する。
また,修正履歴を全て保存できるので,「ファイル名を変えてバックアップ」 のようなことを一切せずに済むようになる。
この操作にはSCMソフトウェア Git を使用するので,あらかじめインストールしておく。
~/.gitconfig
ファイルに以下の書式で自分のローマ字氏名と
メイルアドレスを記述する。
[user] email = 自分のemailアドレス name = ローマ字氏名
研究室用の共有サーバを www.yatex.org 上に作成した。 ここに繋ぐための準備手順を示す。そのためには公開鍵認証用の 鍵ファイルを作成する。計算機故障等でなくすと困るのでroyで作成して それを手元計算機にコピーするようにする。
royにログインし,以下のようにコマンド起動する。 なお,他の科目でこの作業をした場合は不要。
ssh-keygen Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): パスフレーズ入力 Enter same passphrase again: : パスフレーズ入力
パスフレーズは15〜20文字程度のすばやく打てるものを付ける。
手元の計算機にroy上の鍵ファイルをコピーする。
scp c1yyxxx@roy.e.koeki-u.ac.jp:.ssh/id_rsa'*' ~/.ssh
c1yyxxx にはroyでの自分のユーザ名を入れる。
作成してコピーしてきた ~/.ssh/id_rsa.pub
ファイルを広瀬宛てに送る。これを読んでいる時点で完了しているはず。
手元の計算機の ~/.ssh/config
に以下の記述を追加する。
Host labosv HostName www.yatex.org User GitBucketサーバのユーザ名 Port 29418 AddressFamily inet
研究室 GitBucket サーバにログインし、右上のユーザアイコンをクリックで開いて、 「Account Settings」に進み左に出てくる 「SSH Keys」を開く。
Add a public SSH Key |
Title |
この欄に鍵につける名前を入れる |
Key |
この欄に cat ~/.ssh/id_rsa.pub して 得られる行を貼り付ける |
上記手順全て完了したら,手元の計算機の端末から接続できるか確認する。
ssh labosv Enter passphrase for key '/home/taro/.ssh/id_rsa': (パスフレーズ入力) Welcome to _____ _ _ ____ _ _ / ____| (_) | | | _ \ | | | | | | __ _ | |_ | |_) | _ _ ___ | | __ ___ | |_ | | |_ | | | | __| | _ < | | | | / __| | |/ / / _ \ | __| | |__| | | | | |_ | |_) | | |_| | | (__ | < | __/ | |_ \_____| |_| \__| |____/ \__,_| \___| |_|\_\ \___| \__| Successfully SSH Access.
ここでは ~/hoge
にある内容を履歴管理する。
通常はあるディレクトリを決めてその配下を管理する。
保存したい作業ディレクトリを決めて, そこでGitリポジトリを構築する。
cd hoge cat > .gitignore<<EOF *.aux *.log *.toc *.o *~ \#* .DS* tmp/ EOF git init; git add .; commit -m init
GitBucketサーバにログインし、右上の +▼ から新規リポジトリを作成する。Repository name(リポジトリ名) と Description(説明)を埋めて末尾の緑ボタンで作成する。
以下のメッセージが出るのでそのとおりにコマンド入力する。
touch README.md git init git add README.md git commit -m "first commit" git remote add origin https://www.yatex.org/gitbucket/git/ユーザ名/リポジトリ名.git git push -u origin master
git status
- 状態を見る
cd したらとにかく hg status
する。
リポジトリの状態が分かる。とにかく git status
をこまめに打つ。
git pull
- リモートサーバの更新を取得(+反映)
サーバの修正を取得する。作業開始時に必ず行なう。
git commit -m "メッセージ" 更新ファイル
- コミット
行なった修正をリポジトリに登録する。 登録したものが番号付けされ永久保存版になる。 更新したファイル全てを登録したいときは「更新ファイル」の 部分に -a を指定する。
git push
- 更新をリモートサーバに送る
コミットした更新群をまとめてリモートサーバに送る。 席を離れる前に忘れずに。
Emacsでファイルを編集した場合は,ある程度の修正ができたところで コミット(C-x v v)や,push (C-x v P) をする。
コミットすると,ログ記述バッファが開くので,やった作業の簡潔な説明を書き, C-c C-c で確定する。
一度サーバリポジトリに登録しておけば,作業の続きをネットに繋がった 別ホストで行なえる。たとえば,royや個人のPC複数台で行なう例を示す。
大まかな流れとしては,royなどにログイン後, サーバからリポジトリを複製する。その後は以下の流れで作業を行なう。
必ず「
なお,pullのときに他のリポジトリを指定すると,そこから更新を
直接取得できる。たとえば,royのtaro/
ディレクトリで作業した
結果をサーバにpushしていなくても,たとえばmypcから,
cd ~/foo git pull ssh://roy/foo
とすると更新をmypcに取得でき,さらにこれを
git push
するとサーバに更新を送り込むことができる。
[サーバリポジトリ] | | | | | 複製C | 複製B 複製A
上図のような関係で運用していて,複製Aで行なった更新をサーバにpushし, 次の日,複製Bで作業を始めるときにpullし忘れてから作業し始めたとする。 すると,Bでコミットしたものをpushするときに以下のようになる。
git push To ssh://labosv/user/repo ! [rejected] master -> master (fetch first) error: failed to push some refs to 'ssh://labosv/user/repo' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
先にAでの更新を取り込んでおくべきだった。この場合はあとで Aの更新を取り込み,マージする。
git pull
マージ(修正の併合)メッセージの入力を促されるので、 たいていそのまま保存終了(ZZ)する。。
Merge branch 'master' of ssh://labosv/user/repo
(viが上がっている場合はZZ、その他のエディタは保存終了する)
マージすべきときに,同じ箇所に違う修正を施していると衝突が起こる。
git pull 8e0e4e8..bccdf15 master -> origin/master Auto-merging README.md CONFLICT (content): Merge conflict in README.md Automatic merge failed; fix conflicts and then commit the result.hg resolve -l # 衝突ファイル一覧を得る U hello.c
ファイルを開くと衝突箇所に `<<<<<<<
'
というマークが付く。2つの修正候補のどちらかを残して他を消す。
int main(int argc, char **argv) { <<<<<<< /tmp/mh2/hello.cprintf("HELLO, WORLD!\n"); =======printf("Hello, world!\n"); >>>>>>> /tmp/hello.c~other.WW1aE0 return 0; }
ここでは下(赤)の方を選んだとして,
int main(int argc, char **argv) { printf("Hello, world!\n"); return 0; }
のように修正し,git add で修正済みとする。
git add hello.c git commit -m resolved hello.c
リモートサーバへの接続時のパスフレーズ入力を代理で済ませてくれる
ソフトウェア ssh-agent を使うと頻繁なpush/pullが楽になる。
~/.ssh/id_rsa
ファイルを用意し終えた状態で,仮想端末から
ssh-add を起動し,以下のようなパスフレーズ入力プロンプトが出たら
既に ssh-agent が常駐している。
ssh-add Enter passphrase for /home/taro/.ssh/id_rsa
このままパスフレーズを入れておけば,次回の公開鍵認証の パスフレーズ入力が省略される。
ssh-add で無反応の場合は,別途 ssh-agent を起動する必要がある。 エージェントを利用する仮想端末をひとつ決めてそこで以下のように操作する。
ssh-agent $SHELL ssh-add emacs &
上記のように,編集作業などはこのシェルから起動したemacsを用いる。
リポジトリ管理しているファイルの,コピー/移動/削除は cp/mv/rm で行なってはいけない。リポジトリの登録情報とずれるからである。 これらは全てgitのサブコマンド cp/mv/rm aで行なう。
git cp |
履歴を含めてファイルをコピーする。ディレクトリをまるごとコピーする こともできる。 |
git mv |
履歴ごとファイルを移動する,またはリネームする。 ディレクトリをまるごと移動することもできる。 |
git rm |
リポジトリ内ファイルと作業ディレクトリのファイルを両方削除する。 git rm -r でディレクトリごと削除することもできる。 |
git log
してみると,全ての履歴に
日付けとチェンジセットIDが付いているのが分かる。
このIDでリビジョン指定ができ,その時点の状態を特定できる。
たとえば,2013年2月2日の時点のファイルを取り出したいとする。 眺めたいだけ,1つだけファイルを取り出したい,全てのファイル集合を見たい, 場合によって切り替える。以下,REV というリビジョンの ファイルの取り出し方について示す。
git show REV:ファイル | less
などとする。
あるいは,Emacsで見たいファイルを開き C-x v g (vc-annotate) を呼び,p や n や j で任意のリビジョンを表示させる。
git show REV:ファイル >
出力先ファイル
などとする。
あとから取り出すであろうリビジョンにはタグ をつけられる。
# 現在のワーキングリビジョンに hogehoge-1 というタグをつけるgit tag hogehoge-1 # リビジョン321eに hogehoge-0.5 というタグをつけるgit tag -r 321e hogehoge-0.5
タグをつけたリビジョンは,タグ名でアクセスできる。たとえば,
git show hogehoge-0.5 git archive hogehoge-0.5 /tmp/hogehoge-0.5.tar.gz
コマンド | はたらき |
---|---|
git status | リポジトリの状態表示 |
git clone |
gi clone URL1 URL2
で URL1 のリポジトリを URL2 に複製する。 URLにはリポジトリを示すディレクトリや, ssh://サーバ/ディレクトリ 形式が指定可能。 |
git pull |
複製元リポジトリの更新を取得する。後ろにリポジトリURLを 指定して別のリポジトリからの取得も可能。 |
git push |
複製元リポジトリへ更新を送り込む。後ろにURLを指定可。 |
git add |
指定したファイルを更新登録 |
git log |
更新履歴とログを出力 |
git diff |
リポジトリ登録版との差分出力 git diff REV [ファイル] とすると,リビジョン REV との差分を出力する。 REV1 REV2
とすると,REV1 から
REV2 への差分を出力する。
|
git checkout [file] |
最後のコミット以後の修正を破棄して元に戻す。 |
キー | はたらき |
---|---|
C-x v v | コミット |
C-x v l | ログを見る |
C-x v = | 差分を見る C-u C-x v = として,2つのリビジョンを指定すると それらの差分を見られる。 |
C-x v g | git blame を行なう どの行をどのリビジョンで採り入れたかを視覚的に調べられる |
C-x v + | pull を行なう |
C-x v P | push を行なう |
C-x v d | ディレクトリ単位でstatus |
キー | はたらき |
---|---|
n | 次(下)のログへ |
p | 前(上)のログへ |
d | そのチェンジセットの差分表示 |
a | そのリビジョンで annotate 表示 |
vc-annotate は,タイムマシンのように目の前に以前のリビジョンの 内容がどんどん現われるので,昔のリビジョンをじっくり参照したいときに便利。
キー | はたらき |
---|---|
p | 古いリビジョンへ |
n | 新しいリビジョンへ |
j | カーソル行のリビジョンへ |
a | カーソル行のリビジョンの直前リビジョンへ |
w | ワーキング(作業中)リビジョンへ |
v | 冗長表示切り替え |
d | 該当リビジョンの差分表示 |
l | 該当リビジョンのログ表示 |