tsuyoshin’s Tech Blog

https://qrunch.net/@tsuyoshin から移転してきました。

git push --mirror で (deny updating a hidden ref)

AOSP のローカルリポジトリをバックアップ目的でリモート(Gitlab)にミラーしている。
Gitlab を Ver.11.10.4 にアップデート後、ミラー時にワーニングが発生するようになった。

$ git remote add gitLab git@192.168.1.70:root/aosp-build.git
$ git push --mirror gitlab

以下のようなワーニングが延々と表示される。。。

 ! [remote rejected] aosp/android-arch-navigation-release -> aosp/android-arch-navigation-release (deny updating a hidden ref)
 ! [remote rejected] aosp/android-arch-work-release -> aosp/android-arch-work-release (deny updating a hidden ref)
 ! [remote rejected] aosp/android-live-tv -> aosp/android-live-tv (deny updating a hidden ref)
 ! [remote rejected] aosp/android-live-tv-l-mr1 -> aosp/android-live-tv-l-mr1 (deny updating a hidden ref)
 ! [remote rejected] aosp/android-support-test -> aosp/android-support-test (deny updating a hidden ref)
 ! [remote rejected] aosp/androidx-annotation-release -> aosp/androidx-annotation-release (deny updating a hidden ref)

なお Ver.11.04 までは、ワーニングは発生しなかった。
Gitlab 内の refs/ が ReadOnly のため?
GitHub でも、プルリクエストを行うと発生するらしい。

ミラーリング自体は行われているため、実用上問題ないが見た目が悪いため、ワーニングの発生しない方法を検討する。

# --all にて PUSH。ブランチは追加されるがタグが無視される。
$ git push --all gitlab
# --tags にて PUSH。タグのみ追加される。
$ git push --tags gitlab

ローカルに追加されたブランチ、タグの追加は、上記コマンドで可能。
しかし、ローカルで削除されたブランチ、タグをリモートに反映できない。
そこで、--prune を用いる。

# ローカルに存在しないリモートのブランチを消去し、ローカルの新規ブランチを追加。
$ git push --prune gitlab "refs/heads/*:refs/heads/*"
# ローカルに存在しないリモートのタグを消去し、ローカルの新規タグを追加。
$ git push --prune gitlab "refs/tags/*:refs/tags/*"

これだと、コマンドを2回実行しないといけないため面倒。
そこで、設定ファイルを編集してみる。

$ git config -e
[remote "gitlab"]
        url = git@192.168.1.70:root/aosp-build.git
        # 下記追加
        # <src>:<dst> の形式で、オプションとして先頭に + を付けます。
        # + の記号は Git にそれが早送り(fast-forward)でない場合でも参照を更新することを伝えます。
        # refs/heads -> ブランチ情報
        # refs/tags  -> タグ情報
        push = +refs/heads/*:refs/heads/*
        push = +refs/tags/*:refs/tags/*

上記設定後は下記コマンドのみでブランチ、タグの同期可能。

$ git push --prune gitlab