2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Gitでshallow cloneしたリポジトリのdepthを保ったままpullするには

Last updated at Posted at 2020-06-07

はじめに

git clone 時に --depth=N (Nは自然数)オプションをつけると、履歴を最新N件だけしか保持しない作業ツリーを取得することができる。

ただし、その後でオプションなしで git pull すると、それ以降の履歴はふつうに取得できる。

これに対して、最初にcloneしたときのdepthを保ったままpullする、ということをやりたいと思ったが、検索しても中々やり方が見つからなかったので、手元で試行錯誤した。

動作環境

  • Ubuntu 18.04
  • git v2.17.11

結論(2020-06-25時点)

今のところ、安全に git pull するやり方が見つかっていない。後述のように、どうしてもCONFLICTが発生してしまうことがある。
そのため、作業ツリーのdepthを維持するには、次のようにやや強引にbranchを作り直すしかなさそう:

# 前提: originからmasterをcheckoutしているものとする
git fetch --depth=N
git checkout origin/master
## masterを削除してorigin/masterからcheckoutし直す
git branch -D master
git checkout -b master
## (オプショナル)元の状態に戻すため、追跡ブランチを設定しておく
git branch -u origin/master

駄目だったやり方

git pull --depth=N

最初、シンプルにこれで行けるんじゃないかと期待したのだけど、どうもエラーが出る。
動いてはいたので、実は問題ない?

実行例
$ git pull --depth=1 [--update-shallow]
:
 + f22f6e5...caec91c master     -> origin/master  (forced update)
error: Could not read 843b95a87c496da6eac6160744854af3070db0fd
error: Could not read 843b95a87c496da6eac6160744854af3070db0fd
First, rewinding head to replay your work on top of it...

NOTE:

  • --update-shallow.git/shallow の更新を許可するオプションだが、ここでは付けても付けなくても結果は同じだった

git fetch --depth=N; git rebase origin/BRANCH

これは上手く行くときもあったが、CONFLICTすることもあった。

実行例
$ git fetch --depth=1; git rebase origin/master
First, rewinding head to replay your work on top of it...
Applying: add baz.txt
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging baz.txt
CONFLICT (add/add): Merge conflict in baz.txt
error: Failed to merge in the changes.
Patch failed at 0001 add baz.txt
Use 'git am --show-current-patch' to see the failed patch

Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".

git fetch --depth=N && git pull

実行例
git fetch --depth=N
git pull

これなら大丈夫そうだと思ったのも束の間、やはりCONFLICTしてしまうことがあった。

git fetch --depth=N; git merge orgin/BRANCH --squash

単純にmergeしても駄目そうな気がしたけど、 --squash を付ければひょっとしたら行けるかな、と思ったけど、やっぱり駄目だった。

実行例
$ git fetch --depth=1; git merge origin/master [--squash]
fatal: refusing to merge unrelated histories

参考

  1. aptで入れてるので最新ではない

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?