#きっかけ
https://qiita.com/taptappun/items/e499dfa937cd8f04d74d
こちらの記事を読んで自分でもやってみたくなった。
記事ではNode.jsを用いてスクリプトを作られているが、バッチファイルでもできそうだなーと思ったので、今回はバッチでやってみた。
#Githubの仕様
100MB以上のファイルはプッシュできないらしい。検証すると50MB以上のファイルでも警告が出た。
#作ったもの
今回作ったバッチは二つ。
①ファイルをバイナリ単位で分割してgit pushするバッチファイル(push.bat)
ファイルの容量が50MBでも警告が出たので、とりあえず40MBごとに分割するようにした。
分割されたファイルの部分たちは「target」ディレクトリ内の「ファイル名_File」というディレクトリに格納されてpushされることになる。
②分割されたファイルを結合するバッチファイル(connect.bat)
先ほどの①の逆の動作をするバッチファイル。git cloneの機能は面倒だったので省いた。
「ファイル名_File」ディレクトリ内のファイルを結合する。
#コード
mkdir target
for %%i in (*) do (
copy %%i .\target
)
cd .\target
for %%i in (*) do (
split -b 41943040 %%i %%i.copy.
mkdir %%i_File
for %%j in (%%i.copy.*) do (
move %%j .\%%i_File
)
del %%i
)
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin %1
git push -u origin main
setlocal enabledelayedexpansion
for /d %%i in (*_File) do (
set dirname= %%i
cd !dirname!
copy /b * !dirname:~0,-5!
move !dirname:~0,-5! ..\
cd ..\
rd /s /q !dirname!
)
やってることは超単純。
#使い方
push.bat
①githubで適当にリポジトリを作る。
ここは理解している前提。URLも取得しておく
②適当にディレクトリを作る。
ディレクトリ内のすべてのファイルを分割してpushする仕様なので、例えばデスクトップで実行しないよう注意。
③コマンドプロンプトを起動して、②のディレクトリに移動する
④分割&pushしたいファイルをすべて②のディレクトリにコピーする。
仕様上、ディレクトリの分割は不可であり、ファイルの分割&pushしか対応していない。
ファイルだけ移動させること。再帰的なコードを書けばいいんだけど、めんどくさかったー。
⑤第二引数に①で取得したURLを指定して、push.batを実行する。
うまくいけばgit pushされるはず
connect.bat
①git cloneでバックアップしたデータを取得する
②ディレクトリに移動し、connect.batを実行する
#注意。最後に言うのもなんだけど
・先ほども言ったが、ディレクトリの分割&pushには対応していない。ファイルならいくつ並べてもいいけどディレクトリは不可。
例えば写真をアップロードしたいならpush.batを実行するディレクトリにそのままドラッグ&ドロップしてほしい。
・規約違反ではないらしいけど、ぶっちゃけモラル的によくない使い方。やるなら自己責任で。やらないほうが良いかも。
ていうか、そもそも実用性はほぼない。あくまで実験である。
気が向いたらディレクトリのpushにも対応したバージョンを書こうと思います。