ソースコードからインストールしたGitを削除して、IUSリポジトリからインストールする。

### モチベーション

yum でインストールできる Git はとても古いので、ソースコードからインストールした。
でも更新とか面倒くさいので、 yum を使いたい。

### 検証環境

* OS: macOS High Sierra (10.13.1)
* Vagrant: 2.0.1
* Virtualbox: 5.2.0 r118431

## 前提

### ソースコードから Git をインストールした時の手順

必要なパッケージをインストールする

```
$ yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
```

wgetが入っていない場合はインストールする

```
$ yum install -y wget
```

ソースコードをダウンロードする

```
$ cd /usr/local/src/
$ wget <git url>
$ tar xzvf git-2.15.0.tar.gz
```

Git をインストールする

```
$ cd git-2.15.0
$ make prefix=/usr/local all
$ make prefix=/usr/local install
```

tar.gz を削除する

```
$ rm -rf git-2.15.0.tar.gz
```

## ソースコードからインストールした Git を削除する

### 1. DESTDIR を指定して Git をインストールする（インストール先は任意）
**！削除したい Git のインストール時と同じ設定にする（prefix, exec-prefix 等）**
※ 手元では make all は実行しなくても大丈夫でした

```
$ mkdir /var/tmp/git
$ make prefix=/usr/local DESTDIR=/var/tmp/git all
$ make prefix=/usr/local DESTDIR=/var/tmp/git install
```

### 2. 対象ファイルをリストアップして削除する

```
$ find /var/tmp/git -type f -printf '/%P\n' | xargs -n 10 rm -f
```

補足1: find について

%P: コマンドライン引き数で指定された部分を除いて、ファイル名を印字する
\n: 改行

-printf なし

```
/var/tmp/git/usr/local/bin/git
/var/tmp/git/usr/local/bin/git-upload-pack
/var/tmp/git/usr/local/bin/git-shell
/var/tmp/git/usr/local/bin/git-cvsserver
(以下略)
```

-printf '/%P'

```
/usr/local/bin/git/usr/local/bin/git-upload-pack/usr/local/bin/git-shell/usr/local/bin/git-cvsserver/(以下略)
```

-printf '/%P\n'

```
/usr/local/bin/git
/usr/local/bin/git-upload-pack
/usr/local/bin/git-shell
/usr/local/bin/git-cvsserver
(以下略)
```

補足2: xargs について

-n MAX-ARGS: コマンドライン1つにつき最大MAX-ARGS個の引数を使用する

```
$ echo 'foo bar baz' | xargs -n 1 echo
foo
bar
baz

$ echo 'foo bar baz' | xargs -n 2 echo
foo bar
baz
```

### 3. 対象ディレクトリをリストアップして削除する
※ 手元ではこの手順は飛ばしました

```
$ find /var/tmp/git -type d -printf '/%P\n'
```

※ 下記のように削除してはいけないディレクトリも出力に含まれているため、自分で取捨選択をする必要があります

```
/
/usr
/usr/local
/usr/local/bin
/usr/local/libexec
/usr/local/libexec/git-core
(以下略)
```

### 4. yum から Git を削除する
ここで削除しておかないと、後続の git2u インストール時に下記のようなエラーが出たりします
※ 手順3.をちゃんとやっていれば必要ないかもしれません

```
Error: git2u-perl-Git conflicts with perl-Git-1.8.3.1-12.el7_4.noarch
```

yum から Git を削除

```
$ yum remove git
```

## IUS リポジトリから Git をインストールする

### 1. IUS リポジトリを追加する

```
$ wget https://centos7.iuscommunity.org/ius-release.rpm
$ rpm -Uvh ius-release.rpm
```

rpm 実行時に下記のようなエラーがでたら

```
error: Failed dependencies:
	epel-release = 7 is needed by ius-release-1.0-15.ius.centos7.noarch
```

epel-release を追加する

```
$ yum install -y epel-release
```

yum コマンド実行時の自動使用を無効にする（任意）

```
$ vi /etc/yum.repos.d/ius.repo
-----
[ius]
：（略）
enabled=1
↓変更
enabled=0
-----
```

ius リポジトリを指定して Git(git2u) をインストールする

```
$ yum --enablerepo=ius install -y git2u
```

確認

```
$ git --version
git version 2.14.3
```

もし、下記のようなエラーがでたら

```
-bash: /usr/local/bin/git: No such file or directory
```

hash コマンドで修正する
-r: ハッシュテーブルに記憶しているパス情報を消去する
-d: コマンド名: コマンド名に対応する記憶を削除する

```
$ type git
git is hashed (/usr/local/bin/git)

$ hash -r
 or
$ hash -d git

$ type git
git is /usr/bin/git
```

## 参考

[How to uninstall git installed from the source?](https://serverfault.com/questions/444289/how-to-uninstall-git-installed-from-the-source)

[CentOS7.1 64bitのyumリポジトリにIUSを追加](http://www.kakiro-web.com/linux/ius-install.html)

[How do I clear Bash's cache of paths to executables?](https://unix.stackexchange.com/questions/5609/how-do-i-clear-bashs-cache-of-paths-to-executables)