Githubの初期設定

# はじめに
<!-- 発端や概要を記載 -->

私は機械学習用にRTX3090のデスクトップPCを1台持っており、定期的にメンテナンスを行なっています。
今回、RTX3090環境へUbuntu24.04をインストールしたので、その作業内容をメモとして公開します。

GithubはSSHで管理するのが楽なのですが、OSを新しくすると毎回設定作業が必要になります。
本記事では、私がいつも実施する初期設定メモを公開します。
2024年8月時点でubutu24.04にて動作確認済です。

なお、関連する記事は下記の通りです。
- [RTX3090環境へのUbuntu24.04セットアップ](https://qiita.com/genmai99/items/501ace251eaefbcb3649)
- [RTX3090/Ubuntu24.04でNVIDIA環境をセットアップ](https://qiita.com/genmai99/items/c0e6ffda4e23394bccd8)
- (本記事) Githubの初期設定
- [画像認識の環境構築とVSCodeの設定](https://qiita.com/genmai99/items/3d02a722772e1135518d)
- [私のVSCodeのカスタマイズ](https://qiita.com/genmai99/items/5e4cc56420f51a80828a)

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [ローカルPC内設定](#ローカルpc内設定)
1. [Githubのサイトで設定](#githubのサイトで設定)
1. [環境設定](#環境設定)
1. [Tips](#tips)
1. [最後に](#最後に)
1. [参考文献](#参考文献)

<!-- 各チャプター -->
<a id="#ローカルpc内設定"></a>
# ローカルPC内設定

- はじめて登録する場合はemailとusernameをいれる

```
$ git config --global user.email "xxxx@xxxx.com"
$ git config --global user.name "xxxx"
```

- 設定できたか確認

```
$ git config --list
USer.email=xxxx@xxxx.com
USer.name=xxxx
```

- sshキーがないか確認

```
$ ls -al ~/.ssh
```

- もし作っていれば、下記のファイルが表示される。あるならそれを使えばよい
  - id_dsa.pub, id_ecdsa.pub, id_ed25519.pub, id_rsa.pub

- sshキーがない場合は新規作成

```
$ ssh-keygen -t rsa -b 4096 -C "xxxx@xxxx.com"
Enter file in which to save the key (/home/xxxx/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again:
```

  - 上記はrsaの鍵を4096バイトでメールアドレスをコメントとして作成するというコマンド
    - -t : 鍵の種類（dsaとかrsaとか）
    - -b : バイト数
    - -C : コメントの新規作成
  - Enter file in which to save the key: デフォルトで良いのそのままEnter
  - Enter passphrase (empty for no passphrase): 11文字以上のpassphraseを入力
  - Enter same passphrase again: 同じpassphraseを入力

<a id="#githubのサイトで設定"></a>
# Githubのサイトで設定

- id_rsa.pubの内容を表示し、全てクリップボードにコピー

```
$ cat ~/.ssh/id_rsa.pub
```
- GitHubのwebページで右上にある自分のアイコンをクリック
- Settingsをクリック
- 左側の一覧からSSH and GPG keysを選択
- New SSH keyをクリック
  - Title: わかりやすい名前（ubuntu24.04など）を入れる
  - Key type: Authenication Keyを選択
     - 「Authenication Key」と「Signing Key」のどちらかから選べます
       - Authenication Key: 認証鍵を用いる方式
       - Sighning Key: S/MIMEを用いて公開鍵にデジタル署名をつける方式
     - 大半の人はAuthentication keyを選べばよいかと思います
  - key: コピーしたid_rsa.pubの内容を貼り付けてAddを選択



<a id="#環境設定"></a>
# 環境設定

### passphraseの入力ショートカット設定

毎回聞かれて入力するのは面倒なので登録しておく
- ssh-agentを起動し、passphraseを登録
```
$ eval "$(ssh-agent -s)"
```
  - Agent pid (数字)と表示される(数字は様々)
  - 何かが表示されていれば良い
  - パスフレーズの追加

```
$ ssh-add
Enter passphrase for /home/genmai99/.ssh/id_rsa: 
```
- passphraseを入力
- 以上で2回目の接続から入力がショートカットされる

### token設定
リモートからのPushが今はパスワードからできません。
下記を参考にTokenを取得し、push時に聞かれたら入力をしましょう。
https://qiita.com/shiro01/items/e886aa1e4beb404f9038


<a id="#tips"></a>
# Tips

自分用にTipsをまとめておきます。

### 更新する

- addしたいファイルを指定する

```
$ git add README.md
```
- (参考) ディレクトリの中身を全部一括でaddする場合は下記

```
$ git add .
```

- コミットのコメントを書く

```
$ git commit -m "Change README"
```
- プッシュする

```
$ git push origin main
```

- (参考) pushでエラーなったらpullして同期してから、もう一回push

```
$ git pull
```

- (参考) なお、リモートほうが新しい場合は下記でリモートから引っ張ってくる

```
$ git pull origin main
```

### 変更内容の確認

- ローカルの変更したファイルを確認する
- ファイル名に色がついていますが、内訳は下記通り
  - 赤文字：addされてないファイル
  - 緑文字：addされているファイル

```
$ git status
```

- ローカルの変更したファイルの中身を確認する

```
$ git diff
```

- 過去の変更のコミットメッセージを見る

```
$ git log
```

- 過去の変更の内容を見る

```
$ git log -p
```

- (参考) 抜けるときはq


### 直前のコミット内容を変更する

- 単純にコメントを変更すればOK

```
$ git commit --amend -m "修正したいコメント"
```

### ２つ以上前のコミット内容を変更する

- 確認

``` 
$ git log --oneline
098eab3 (HEAD -> main, origin/main, origin/HEAD) Add comment
bb7b9f8 Add comment
d131cec Add comment
4424f97 Add japanese explanation
29fbe5d Add japanese explanation
```

- rebaseする
  - １番最初のコミットではない場合
    - 1番新しいコミットを1
    - 修正したいコミットまでの数を数え「HEAD~」のあとにその数を入力
    - 例えば最新から3番目に古いコミットを修正する場合は「HEAD~3」

    ```
    $ git rebase -i HEAD~3
    ```
    
    - ここでviが開くので、下記から修正したいコメントをpickからeditに変更する
    
    ```
    pick 098eab3 Add comment
    pick 74cde1a Add japanese comment
    pick 1502259 Add japanese comment
    ```

  - 1番最初のコミットの場合
    - 1番最初のコミットはこのコマンドじゃないと出てこない
    
    ```
    $ git rebase -i --root
    ```

    - ここでviが開き、HEADで指定した時と同様だが全コメントが載っているファイルが開く
    - HEADで指定した時と同様に、修正したいコメントをpickからeditに変更する

- rebaseできているか確認

```
$ git log --oneline
```

- コメントを変更

```
$ git commit --amend -m "修正コメント"
```

- Git がrebaseの残りの処理を続けるためにcontinueをかける

```
$ git rebase --continue
```

- 改変した結果をリモートにpush
  - ローカルとリモートの歴史の差分が生じたため、普通のpushだと正常にpushできない
  - なので強制pushのオプションをつけて実行する

```
$ git push -f origin main
```


### 既存のローカルプロジェクトをレポジトリへ送る

- GitHubへアップロードしたいプロジェクトディレクトリへ移動

```
$ cd work/test/
$ git init
```

- プロジェクトディレクトリ内にあるファイルやディレクトリを全てコミット 

```
$ git add .
$ git commit -m "Initial Commit"
```

- リモートリポジトリのURLを追加(基本forkして作業するのでfork元をupstreamとしてもよい)

```
$ git remote add origin https://github.com/githubID/test.git
```

- リモートリポジトリにプッシュする
　　- Githunのヘルプでは -u オプションがついているが、ここでは自分のoriginにpushしたいのでつけない

```
$ git push origin main
```
 
### GitHubのユーザー名を変える

- ユーザー名の変更前後は下記を想定する
  - 変更前: UserA
  - 変更後: UserB

- GitHub上での変更
  - Settings→Account→Change usernameから変更

  - Local (Ubuntu24.04)での変更

  ```
  $ git config --global user.name "UserB"
  ```
    
  - Repositoryの設定変更
  
  ```
  cd work/test
  ```
  - ユーザー名を確認
  ```
  $ git remote -v
  origin	https://github.com/UserA/test.git (fetch)
  origin	https://github.com/UserA/test.git (push)
  ```
  
  - 変更
  
  ```
  $ git remote set-url origin https://github.com/UserB/test.git
  ```

### pushできない
- pushしてみたら、400エラーでプッシュできなかった

  ```
  Enumerating objects: 19, done.
  Counting objects: 100% (19/19), done.
  Delta compression using up to 8 threads
  Compressing objects: 100% (13/13), done.
  error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400
  send-pack: unexpected disconnect while reading sideband packet
  Writing objects: 100% (13/13), 2.61 MiB | 4.24 MiB/s, done.
  Total 13 (delta 7), reused 0 (delta 0), pack-reused 0
  fatal: the remote end hung up unexpectedly
  Everything up-to-date
　　　　```

- こういう時は下記でhttp.postBufferの容量を500MiBにして解決する
    ```
    git config http.postBuffer 524288000
    ```
<a id="#最後に"></a>
# 最後に
githubの初期設定についてまとめ、追加としてTipsも少し記載しました。
次は画像認識の環境についてまとめようと思います。


<a id="#参考文献"></a>
# 参考文献
- [SSH を使用した GitHub への接続](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh)
- [GitHubがパスワード認証を廃止するらしいので](https://qiita.com/shiro01/items/e886aa1e4beb404f9038)
- [githubでfatal: Authentication failedが出て急にpush,pullできなくなった](https://zenn.dev/shuzon/articles/66cef6debf17159a4011)

下記はMacを使うときに有用
- [.gitignoreで.DS_Storeを削除しよう](https://qiita.com/takashimelon/items/def769aaaa1d41cc44d4)

下記はエラーが出たときに有用
- [Gitでpushすると400エラーが出た](https://qiita.com/bearl27/items/b768b28eb86fef0b9b5d)