view software/hg.md @ 119:254063df7e73

backup 2023-05-02
author autobackup
date Tue, 02 May 2023 00:10:03 +0900
parents b6c284fd5ae4
children
line wrap: on
line source

# hg

- クロスプラットフォームの分散型バージョン管理システム
- 全てのコマンドはhgから始まる
- mercuryが水銀を意味し、その元素記号がHgであることに由来する
    - https://www.mercurial-scm.org/
    
# 研究室のmercurial web
- http://www.cr.ie.u-ryukyu.ac.jp/hg



## 使い方(コマンドライン編)

### インストール
HomeBrewを使用する。

 brew install mercurial

でインストール出来る。

### hgwebの修正

brew upgrade mercurialでhgwebが動かなくなった時には、
/var/www/cgi-hg/index.cgi の以下の行を修正する。

```
import sys
sys.path.insert(0, "/usr/local/Cellar/mercurial/5.0/lib/python2.7/site-packages")
```

一応修正スクリプトを生成しました

dateを絶対表示にするのは、
`/usr/local/Cellar/mercurial/4.4.2/lib/python2.7/site-packages/mercurial/templates/static/mercurial.js`
の function age をなおしてしまうのが良い。添付ファイルにあるので、それと入れ替える。

### リポジトリの初期化(init)
管理したいディレクトリ内で以下のコマンドを実行する。

```
 hg init
```

### ファイルをリポジトリに追加(add,commit)
ファイルをリポジトリに追加する場合、以下のコマンドを実行する。

```
 hg add ファイル名
```

addで追加対象を設定し、commitでリポジトリに反映させる。

```
 hg commit
```

### リポジトリを複製(clone)
リポジトリを手元に複製し、作業をそこで行う。

```
 hg clone ssh://one@firefly.cr.ie.u-ryukyu.ac.jp/リポジトリ名 ローカル名
```

### 履歴の閲覧(log)
複製したディレクトリ内で実行する。リポジトリ に起きたすべての出来事の要約を、最新のものから時間を遡って表示する。

```
 hg log
 
 changeset:   46:98c2bbeaecb4
 tag:         tip
 user:        convert-repo
 date:        Tue Nov 18 02:12:32 2008 +0000
 summary:     update tags
```

### 変更の確認(diff)
変更の内容を確認する時は、以下のコマンドを実行する。

```
 hg diff
```

### ファイルの削除(remove)
ファイルを削除する時は、以下のコマンドを実行する。

```
 hg remove ファイル名
```

このままでは削除されていないので、commitを行うとリポジトリに反映される。

### commit前の状態に戻す(revert)
誤って削除してしまったり、変更してしまった場合も、commit前なら変更内容を無かった事に出来る。

```
 hg revert --all
```

### タグを打つ(tag)
チェンジセットに独自の識別子を付ける。

```
 hg tag タグ名
```

### サーバーのリポジトリの変更内容を反映する。(pull)
変更内容の同期をとるため、サーバーから変更内容を取得する。

```
 hg pull ssh://one@firefly.cr.ie.u-ryukyu.ac.jp/リポジトリ名
```

### サーバーに変更内容を反映する。(push)
手元にある変更したファイルをサーバー側に反映させる。

```
 hg push ssh://one@firefly.cr.ie.u-ryukyu.ac.jp/リポジトリ名
```

## hgignoreに書いたファイルを削除したい時

```
$ hg forget "set:hgignore() and not ignored()"
```
cf. https://stackoverflow.com/questions/19820020/hg-remove-all-files-listed-in-hgignore

## 基本的な使い方
### はじめ

hg commit したら、

hg push する前に、

 hg incoming

してみて、他の人が commit してないかどうかを見る。

### 衝突無し
なかったら、そのまま hg push する。
そして、hg incoming して、自分のがtopだったら[終り]。

そうではなかったら、やっぱり[衝突あり]	(pushの瞬間に割り込まれた...)

### 衝突あり
何かあったら、

```
 hg pull
```

する。すると、hg heads で、pull した version が出る。これを
merge してやれば良い。hg pull で取れたのが、例えば、(localで) 255だったら、

```
 hg merge -r 255
```

とする。

で、conflict をvi/emacs で修正して、

```
 hg commit
```

で、[はじめ]に戻る。



### リポジトリからファイルを取り除く (convert)
間違えて登録してしまったファイルを最初からなかったかのように跡形もなく消す方法。(forget等と異なり過去のバージョンからも消される)  
まず最初に、消したいファイルのファイルパスを適当なファイルに以下のようにして記述する。
```
 exclude "<file path>"
(例 : convert.txt)

 exclude "history/black.txt"
 exclude "history/black2.txt"
 exclude "aua" #ディレクトリ指定も可能。
 include "aua/auaua.txt" #指定したディレクトリ内のあるファイルのみ保持するときはincludeで指定。
```

次に、hgrcに以下の記述を加えてconvertを利用出来るようにする。
```
 [extensions]
 hgext.convert=
```

それから以下のようにコマンドを打ち、convertする。
```
 hg convert --filemap <削除ファイルのパスを書いたファイル> <対象リポジトリ> <新しく作られるリポジトリのパス>
```

convertが完了したら一度`hg update`を行う必要がある。  
updateしたらhg log等でリポジトリが正しく作成されているか確認し、find等を用いて指定したファイルが削除されているかも確認する。ファイルが消えてない場合大抵convert用のファイルの記述が正しいか、漏れがないか等を確認。  

うまくいっていたら、元のリポジトリの.hg/hgrcを新しいリポジトリにコピーする。そして元のリポジトリを削除して新しい方をrenameすれば完了。

### convert作業例(.svnを間違えて入れちゃったので消す場合)


```
 find ./ -name .svn > convert.txt #.svnの場所を探してconvert.txtに出力。
 sed -e "s/\.\/\//exclude \"/g" convert.txt #convert.txt内の .// を exclude " に、.svn を " に置換。
 sed -e "s/\.svn/\"/g" convert.txt 
 hg convert --filemap ./exclude.txt ../GCC_original ../GCC_original_rm_svn #convert(この前にhgrcでconvertを有効にしておく)
 cd ../GCC_original_rm_svn
 hg update # updateしないとファイルが構成されない。
 hg log # 正しく作成されているかの確認。
 find ./ -name .svn #ちゃんと消えているかの確認。
 cp ../GCC_original/.hg/hgrc ./hg/hgrc #hgrcのコピー。
 cd ..
 rm -r GCC_original #元の削除
 mv GCC_original_rm_svn GCC_original #rename
```


### メールでのpatch送信方法

メールで、最新のcommitをpatchとして送信する方法。

メールを送信したいlocalの   /.hgrc を送信元の名前やメールの設定を追加編集する。

```
 [email]
 method = smtp
 from = Name <mail-address>
 [smtp]
 host = smtp.gmail.com
 port = 587
 tls = starttls
 username = mail-address
```


送信したいrepositoryの .hg/hgrc に、送信先のメールアドレスを設定する。

```
 [email]
 to = mail-address
```


patchをメールで送信するコマンドは以下。

```
 $ hg email .
```

最初、abortが出る。

```
 abort: smtp.gmail.com certificate with fingerprint 9c:0a:cc:93:1d:e7:51:37:90:61:6b:a1:18:28:67:95:54:c5:69:a8 not verified
 (check hostfingerprints or web.cacerts config setting)
```

abortで出たfingerprintを、メールを送信したいlocalの   /.hgrc に追加する。

```
 [hostfingerprints]
 smtp.gmail.com = 9c:0a:cc:93:1d:e7:51:37:90:61:6b:a1:18:28:67:95:54:c5:69:a8
```

Gmailを使用する際、
「安全性の低いアプリがアカウントにアクセスするのを許可する」
設定が必要となる場合がありますので、もしエラーが出たら設定してください。  
https://support.google.com/accounts/answer/6010255

これらの設定で、patchをメールで送信することが出来るようになります。


## 使い方(Eclipse編)

### インストール
Eclipse3.3以上にて、
"Help"->"Software Updates"を選択し  
"Add Site..."から以下のURLを入力する。

 Name: Vectrace (Mercurial Eclipse plugin)
 URL: http://www.vectrace.com/eclipse-update/

その後、新しく現れた項目にチェックを入れて、"install..."でインストール完了。

### リポジトリの追加
"File" -> "New"-> "Project..."より、"Clone Repository using Mercurial"を選択し"Next"  
URLにはコマンドラインと同じ様に

 ssh://one@firefly.cr.ie.u-ryukyu.ac.jp/リポジトリ名 ローカル名

を入力し、ウィザードに従い必須項目を入力する。  
成功すれば、左のウィンドウにプロジェクトが追加される。

### その他の操作
ファイルを右クリックした時に現れる"Team"内にMercurialのコマンドが表示される。  
内容はコマンドラインと一緒なので説明は割愛する。

## リンク
- Mercurial の使い方のチュートリアル  
http://www.selenic.com/mercurial/wiki/index.cgi/JapaneseTutorial
- Mercurial Eclipse  
http://www.vectrace.com/mercurialeclipse/


# おすすめ設定
- ホームディレクトリの.hgrcに書いておくとおすすめの設定

## xcodeのdiffを開かないようにしたい
```
[ui]
merge=internal:merge
```

- こう書いておくと `>>>>` `=====` `<<<<<` のgitっぽい感じでdiffが直接ファイルに書き出される
    - xcodeのdiffとかvim diffは慣れてないと使いづらいので...