技術   Git

Git トラブルシューティング

トラブルシューティング

Git のトラブルシューティングをまとめます。記事投稿後も随時追加・更新していきたいと思います。

Github から https で clone してしまったリポジトリの origin を ssh に変更する方法

状況によっては https でクローンすることも普通にあると思いますので、トラブルということでもないのですが、仮に Github からクローンする時に https でクローンしたものの、やっぱり SSH に変更したくなった場合の方法です。

  1. 現在の origin の状態を確認する。
    まずは、現在のリモートリポジトリの状態を確認します。
    $ git remote -v
    origin	https://github.com/<組織名>/<リポジトリ名>.git (fetch)
    origin	https://github.com/<組織名>/<リポジトリ名>.git (push)

    URL が https から始まっているので、確かに https で git clone していることが確認できます。

  2. origin の URL を変更する。
    # SSH に変更する。
    $ git remote set-url origin git@github.com:<組織名>/<リポジトリ名>.git
    
    # 変更を確認する。
    $ git remote -v
    origin	git@github.com:<組織名>/<リポジトリ名>.git (fetch)
    origin	git@github.com:<組織名>/<リポジトリ名>.git (push)

    git から始まる URL に変更されていることが確認できましたのでこれにて完了です。

容量の大きいファイルのコミットしてしまい、プッシュ出来ない場合の対処方法

容量の大きなファイルをコミットしてしまって、プッシュしようとしてもエラーが出て出来なくなってしまった場合の対処方法です。そもそも Git で大容量のファイルを管理すること自体どうなのかという話なのですが、レガシーなサイトの運用をしていると結構あったりするんですよね。

個人的にこのような場合は、とにかく一旦 Git の管理下から対象のファイルを外してしまうことが先決だと思います。外した後で対象のファイルをどうするのかは所属プロジェクトで話し合って決めてくださいまし。ということでまず、git rm コマンドで Git の管理下から外します。この時、--cached オプションを付けないと実ファイルが削除されてしまうので注意が必要です。

$ git rm --cached <削除したいファイルのパス>

ファイル名やディレクトリ名を大文字から・小文字にまたはその逆に変更した時に、変更ファイルとして認識されない場合の対処方法

ファイル名やディレクトリ名って先頭文字が大文字だったり小文字だったりしますが、一旦コミットしたファイルの先頭文字を変更しても Git に変更したと認識されない場合があります。その時に対処方法です。例として、 main/index.html というファイルの main ディレクトリを Main に変更します。

$ git mv -f main/index.html Main/index.html

これで、変更したと Git に認識してもらえるはずです。

master ブランチに誤ってコミットしてしまい、しかもプッシュまでしてしまった場合の対処方法

これは新人時代に結構やっちゃってましたね。ローカルリポジトリのみでしたら master を一旦削除してプルし直せば良いだけなのですが、リモートリポジトリにプッシュまでしてしまうとそうもいきません。プッシュまでしっかりしてしまった場合は、無かったことには出来ないのでコミットを打ち消すコミットを作成して、それを master ブランチにプッシュします。

  1. 打ち消しのコミットを作成する。
    git revert コマンドを使用して、プッシュしてしまったコミットを打ち消すコミットを作成します。
    コマンド実行後、作成するコミットが vi エディタで開かれるので、コミットメッセージ等変更する場合は変更し、保存して終了する。
    # 現在のコミット(正確には HEAD)のコミット ID を取得する。
    $ git rev-parse HEAD
    55c5a0b4c5235ad6e7bacfb98c9214b8f7aa7bb0
    
    # ちなみに短縮系も取得できる。
    $ git rev-parse --short HEAD
    55c5a0b
    
    # 打ち消しのコミットを作成する。
    $ git revert <打ち消したいコミット ID>
    
    # 実行例
    $ git revert 7cd43d00907044a86bb4a1c9f58b390ae7198e42
    [master c64554c] Revert "文言修正"
     1 file changed, 1 insertion(+), 1 deletion(-)
  2. 作成した打ち消しのコミットに問題がなければ master にプッシュして完了。

git pull しても更新されず、コンフリクトしているようだが対象のファイルがどれなのかわからない場合の対処方法

Git 更新時、コンフリクトしているのでマージを完了出来なかったとエラーが発生したので、コンフリクトを解消しようとしても対象ファイルが見つからず、どうなっているの?という状態になってしまった場合の対処方法です。

  1. git pull を実行するとエラーが発生した。
    You have not concluded your merge (MERGE_HEAD exists). というエラーが出ました。
    $ git pull
    error: You have not concluded your merge (MERGE_HEAD exists).
    hint: Please, commit your changes before merging.
    fatal: Exiting because of unfinished merge.
    
  2. コンフリクトしているファイルの一覧を確認する。
    コンフリクトしているファイルの一覧を確認しても何も表示されず、ステータスを確認しても対象ファイルがどれなのかまではわかりませんでした。
    # コンフリクトしているファイルの一覧を表示する。
    $ git diff --name-only --diff-filter=U
    
    # ステータスを確認する。
    $ git status
    On branch feature/staging
    Your branch and 'origin/feature/staging' have diverged,
    and have 4 and 6 different commits each, respectively.
      (use "git pull" to merge the remote branch into yours)
    
    All conflicts fixed but you are still merging.
      (use "git commit" to conclude merge)
  3. マージをリセットする。
    # マージをリセットする。
    $ git reset --merge
    
    # ステータスを確認する。
    $ git status
    On branch feature/staging
    Your branch and 'origin/feature/staging' have diverged,
    and have 4 and 6 different commits each, respectively.
      (use "git pull" to merge the remote branch into yours)
    
    nothing to commit, working tree clean

    マージをリセットしたら、コンフリクトが解消されていることを確認出来ました。解決は出来ましたが、具体的に何がダメだったのかわからずモヤモヤする。。。

git 更新時、sudo git pull と root 権限で実行して運用する場合の対処方法

【tattch】も初めて経験しましたが、git clone したリポジトリの所有者が apache ユーザーになっていて、更新するのに sudo git pull と root 権限を使用して運用しているプロジェクトでの出来事です。sudo git pull すると Permission denied と言われ怒られてしまいました。

ちょっとレアなケースかもですが対処内容を記載します。

  1. Permission denied のエラーが発生。
    このエラー自体はちょいちょい見かけますね。おそらくプロジェクトの所有者を作業ユーザーに変更するか、Github のリポジトリに root の鍵を登録すれば解消されるかもですが、この辺りのことは【tattch】の管轄外でしたので、余計なことは出来ません。
    $ sudo git pull
    Permission denied (publickey).
    fatal: Could not read from remote repository.
    
    Please make sure you have the correct access rights
    and the repository exists.

    そこで、git の設定を変更して対処します。

  2. config に設定を追加する。
    Github のリポジトリに登録している鍵は作業ユーザーのみです。ただ、sudo git pull のように root 権限で実行すると、暗黙的に /root/.ssh/id_rsa が参照されるらしく、登録してある作業ユーザーの鍵と当然一致しません。そこで、/root/.ssh/config ファイルに下記のように追加し、鍵の参照先を作業ユーザーの鍵に指定します。
    # cat config
    Host github.com
        HostName github.com
        User git
        IdentityFile /home/<作業ユーザー名>/.ssh/id_rsa

    こうすることで、root 権限で実行しても指定した作業ユーザーの鍵を参照して Github にアクセスするようになるので、権限がないとエラーで怒られることも無くなります。
    余談ですが、こういう時 SSH ではなく https でクローンしていれば毎回ユーザー名とパスワードを入力しなければなりませんが、config を変更しなくても怒られないです。

目次へ戻る

終わりに

【tattch】個人が体験した日記みたいなものなので誰かの役に立つかはわかりませんが、これからも随時更新していけばそのうち何かはヒットすると思いますので、頑張って更新していきます。

目次へ戻る