🔓

git fetchの取得制限を解除する

に公開

git cloneするときに付けていた制限を解除し、制限なしに git fetch できるようにする方法をまとめます。

なお、単純かつ汎用の方法はcloneし直すことです。事情がありそれができない場合(リポジトリが大きく取得し直したくない、ワークツリーやローカルリポジトリのみの変更があるなど)や、どう制限がかけられているか知りたい方は読み進めて下さい。

no tags

タグの取得をスキップして clone

$ git clone --no-tags <url>

をしていた場合、tagOpt 設定にオプションが保存されています。

.git/config
[remote "origin"]
        url = <url>
        tagOpt = --no-tags
        fetch = +refs/heads/*:refs/remotes/origin/*

制限を解除し、タグを取得しておきます。

$ git config unset remote.origin.tagOpt
$ git fetch --tags

以後は新しいタグができていれば git fetch の際に取得されます。

single branch

単一ブランチの clone

$ git clone --branch=main --single-branch <url>

をしていた場合、fetchの対象がそのブランチのみに絞られています。

.git/config
[remote "origin"]
        url = <url>
        fetch = +refs/heads/main:refs/remotes/origin/main

制限を解除し、対象外だったブランチも含めfetchしておきます。

$ git remote set-branches origin "*"
$ git fetch

以後は新しいブランチができていれば git fetch の際に取得されます。

blobless

blobless clone

$ git clone --filter=blob:none <url>

をしていた場合、fetchの際にblobオブジェクトを取得せず、必要になったときにリモートから取得する設定が入っています。

.git/config
[remote "origin"]
        url = <url>
        fetch = +refs/heads/*:refs/remotes/origin/*
        promisor = true
        partialclonefilter = blob:none

制限を解除し、取得を保留していたオブジェクトを取得しておきます。これで、リモートに接続できない状況でもfetch済みの任意のリビジョンをチェックアウトできる状態になります。

$ git config unset remote.origin.partialclonefilter
$ git config unset remote.origin.promisor
$ git fetch --refetch

以後は git fetch の際に新しいコミットとともにblobオブジェクトも取得されます。

blobless clone について説明しましたが、treeless clone (--filter=tree:0) の場合も同様です。

shallow

shallow cloneした場合、例えば

$ git clone --depth=1 <url>

としていた場合には、特定のコミット以前の履歴を遡らないような制限がかかります。

.git/shallow
<対象コミットのハッシュ値>

制限を解除し、履歴を最後まで遡ってオブジェクトを取得するには以下のようにします。

$ git fetch --unshallow

Discussion