はじめに
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
参考
- https://git-scm.com/docs/git-clone
- https://git-scm.com/docs/git-fetch
- https://git-scm.com/docs/git-pull
- https://git-scm.com/docs/git-merge
-
aptで入れてるので最新ではない ↩