git fetchの取得制限を解除する
git cloneするときに付けていた制限を解除し、制限なしに git fetch できるようにする方法をまとめます。
なお、単純かつ汎用の方法はcloneし直すことです。事情がありそれができない場合(リポジトリが大きく取得し直したくない、ワークツリーやローカルリポジトリのみの変更があるなど)や、どう制限がかけられているか知りたい方は読み進めて下さい。
no tags
タグの取得をスキップして clone
$ git clone --no-tags <url>
をしていた場合、tagOpt 設定にオプションが保存されています。
[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の対象がそのブランチのみに絞られています。
[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オブジェクトを取得せず、必要になったときにリモートから取得する設定が入っています。
[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 fetch --unshallow
Discussion