はじめに
Gitって難しいですね。どうやってよいかいつも悩んでいるように思えます。
お仕事で別リポジトリへのコピー作業を行ったのですがすんなりいかなかったので調べた結果をまとめて記述しておきます。
コピー元リポジトリからGitHubのリポジトリへ丸ごとコピー(Commit情報やtagも反映)したいのだが
- コピー元リポジトリにバイナリファイルが入っているがLSFを使用していな状態でCommitされている。
- コピー先リポジトリはLFSが使える。
- 「git clone --mirror」しただけではリポジトリのコピーが出来ない。(100MB以上のファイルはCommitできない旨のエラーが発生してCommitできない。)
「git lfs migrate」で必要なバイナリファイルをLFSに登録しなおすことによりリポジトリのコピーが可能になりました。
前提
- コピー元リポジトリからコピー先のGitHubリポジトリへ丸ごとコピーされます。
- Commit情報やtagも反映されます。
- この操作をするとコピー元の情報で上書きされます。(注意!!)
例
- コピー元: https://XXXXXXXX/git/XXXXXXXXXXX/hehehe.git
- コピー先: https://github.com/XXXXXXXXXXXXXXXXXX/new-hehehe.git
参考資料
操作
適当な場所にworkディレクトリを作成します。
コピー元から「--mirror」オプションでgit cloneします。
$ git clone --mirror https://XXXXXXXX/git/XXXXXXXXXXX/hehehe.git
Cloning into bare repository 'hehehe.git'...
remote: Enumerating objects: 32, done.
remote: Counting objects: 100% (32/32), done.
remote: Compressing objects: 100% (30/30), done.
remote: Total 32 (delta 10), reused 0 (delta 0)19.00 KiB/s
Unpacking objects: 100% (32/32), 140.21 MiB | 415.00 KiB/s, done.
git cloneしたディレクトリに移動します。
$ cd hehehe.git/
git lfs migrate info による事前調査
クローンした[リポジトリ名].gitフォルダに移動したのち、現在の状態を調査
LFSに登録したいファイル拡張子を確認。
$ git lfs migrate info --everything
migrate: Sorting commits: ..., done.
migrate: Examining commits: 100% (5/5), done.
*.weights 157 MB 1/1 files(s) 100% <<===これをLFSに移行
*.py 23 KB 6/7 files(s) 86%
*.png 15 KB 1/1 files(s) 100% <<===これをLFSに移行
*.pyc 11 KB 3/3 files(s) 100%
*.md 2.9 KB 3/3 files(s) 100%
git lfs migrate import 実行
「--include」にGit LFSに移行するファイルタイプを指定してgit lfs migrate importコマンドを実行する。
$ git lfs migrate import --include="*.weights,*.png,*.jpg" --everything
migrate: Sorting commits: ..., done.
migrate: Rewriting commits: 100% (5/5), done.
master XXXXXXXXXXXXXXXXXXXX -> XXXXXXXXXXXXXXXXXXXXXXXXXXX
migrate: Updating refs: ..., done.
整合性を保つためローカルのファイル・キャッシュを整理する。
$ git reflog expire --expire-unreachable=now --all && git gc --prune=now
Enumerating objects: 33, done.
Counting objects: 100% (33/33), done.
Delta compression using up to 8 threads
Compressing objects: 100% (25/25), done.
Writing objects: 100% (33/33), done.
Building bitmaps: 100% (5/5), done.
Total 33 (delta 10), reused 20 (delta 6), pack-reused 0
GitHub.com へ --mirror でプッシュ
$ git push --mirror https://github.com/XXXXXXXXXXXXXXXXXX/new-hehehe.git
Uploading LFS objects: 100% (2/2), 157 MB | 0 B/s, done.
Enumerating objects: 33, done.
Writing objects: 100% (33/33), 13.64 KiB | 13.64 MiB/s, done.
Total 33 (delta 0), reused 0 (delta 0), pack-reused 33
remote: Resolving deltas: 100% (10/10), done.
To https://github.com/XXXXXXXXXXXXXXXXXX/new-hehehe.git
+ XXXXXXX...XXXXXXXX master -> master (forced update)
GitHubのリポジトリを確認し、全ての変更が反映されている事を確認します。
リポジトリのルートディレクトリに .gitattributes が追加されているので、--include で指定したファイル名、パターンが問題なく記述されていることを確認する。
履歴も改変されて.gitattributesが最初期にコミットされたことになっているはず。