このライブラリにより、Amazon S3 を git リモートおよび LFS サーバーとして使用できるようになります。
S3 をサーバーレス Git サーバーとして使用するための git リモート ヘルパーの実装を提供します。
また、リモートとして使用される同じ S3 バケットに LFS 管理ファイルをプッシュできるようにする git-lfs カスタム転送の実装も提供します。
git-remote-s3 Python スクリプトであり、3.9 以上の Python バージョンで動作します。
走る:
pip install git-remote-s3
git-remote-s3を使用する前に、次のことを行う必要があります。
初期設定を完了します。
AWS アカウントに AWS S3 バケットを作成します (またはすでにバケットを持っています)。
S3 バケットへのアクセスを許可する最小限のポリシーをそのユーザー/ロールにアタッチします。
{
"Sid" : " S3Access " ,
"Effect" : " Allow " ,
"Action" : [ " s3:PutObject " , " s3:GetObject " , " s3:ListBucket " ],
"Resource" : [ " arn:aws:s3:::<BUCKET> " , " arn:aws:s3:::*/* " ]
}オプション (ただし推奨) - SSE-KMS バケット キーを使用してバケットのコンテンツを暗号化し、以前に作成したユーザー/ロールがキーにアクセスして使用する権限を持っていることを確認します。
{
"Sid" : " KMSAccess " ,
"Effect" : " Allow " ,
"Action" : [ " kms:Decrypt " , " kms:GenerateDataKey " ],
"Resource" : [ " arn:aws:kms:<REGION>:<ACCOUNT>:key/<KEY_ID> " ]
}デフォルトでは、すべてのデータは保存時および転送時に暗号化されます。セキュリティ層をさらに追加するには、顧客管理の KMS キーを使用して、S3 バケットに保存されているデータを暗号化します。 KMS コストを最小限に抑えるために、バケット キーを使用することをお勧めします。
リモートへのアクセス制御は IAM 権限によって確保され、次の場所で制御できます。
S3 リモートはプレフィックスs3://で識別され、少なくともバケットの名前を指定します。 s3://my-git-bucket/my-repoのようにキーのプレフィックスを指定し、プロファイルs3://my-profile@my-git-bucket/myrepo指定することもできます。
mkdir my-repo
cd my-repo
git init
git remote add origin s3://my-git-bucket/my-repo次に、ファイルを追加し、変更をコミットしてリモートにプッシュできます。
echo " Hello " > hello.txt
git add -A
git commit -a -m " hello "
git push --set-upstream origin mainリモート HEAD は、最初にリモート リポジトリにプッシュされたブランチを追跡するように設定されています。リモート HEAD ブランチを変更するには、HEAD オブジェクトs3://<bucket>/<prefix>/HEAD削除してから、 git-remote-s3 doctor s3://<bucket>/<prefix>を実行します。
リポジトリを別のフォルダーにクローンするには、s3 URI をリモートとして使用する通常の git 構文を使用するだけです。
git clone s3://my-git-bucket/my-repo my-repo-cloneブランチの作成とプッシュは通常どおりに機能します。
cd my-repo
git checkout -b new_branch
touch new_file.txt
git add -A
git commit -a -m " new file "
git push origin new_branchサーバーとの通信に依存しないすべての git 操作は通常どおりに動作するはずです (例: git merge )
LFS を使用するには、まず git-lfs をインストールする必要があります。システムでこれを行う方法については、公式ドキュメントを参照してください。
次に、リポジトリフォルダーで次のコマンドを実行して、S3 統合を有効にする必要があります。
lfs-s3-py installこれは次のショートカットです。
git config --add lfs.customtransfer.lfs-s3-py.path lfs-s3-py
git config --add lfs.standalonetransferagent lfs-s3-pyTIFF ファイルを LFS に保存するとします。
mkdir lfs-repo
cd lfs-repo
git init
git lfs install
lfs-s3-py install
git lfs track " *.tiff "
git add .gitattributes
< put file.tiff in the repo >
git add file.tiff
git commit -a -m " my first tiff file "
git remote add origin s3://my-git-bucket/lfs-repo
git push --set-upstream origin main有効なバケットの Amazon S3 URI と、その下に正しい構造が含まれていない任意のプレフィックスは、有効とみなされます。
git ls-remote空のリストを返し、 git clone S3 URI がリモートオリジンとして設定されている空のリポジトリをクローンします。
% git clone s3://my-git-bucket/this-is-a-new-repo
Cloning into 'this-is-a-new-repo'...
warning: You appear to have cloned an empty repository.
% cd this-is-a-new-repo
% git remote -v
origin s3://my-git-bucket/this-is-a-new-repo (fetch)
origin s3://my-git-bucket/this-is-a-new-repo (push)
ヒント: この動作を使用すると、新しい git リポジトリをすばやく作成できます。
gitの分散的な性質により、(まれではありますが) 異なるユーザーによって同じブランチを独自に変更して 2 つ以上のgit pushが同時に実行される場合があります。
git コマンドは 2 つのステップでプッシュを実行します。
refs/heads/<branch>パスの S3 バケットに書き込むgit-remote-s3コマンドを呼び出します。 2 つ (またはそれ以上) のgit pushコマンドが異なるクライアントから同時に実行された場合、ステップ 1 で同じ有効な ref がフェッチされるため、両方のクライアントがステップ 2 に進み、その結果複数のバンドルが S3 に保存されます。
ブランチには複数のヘッド参照があり、後続のgit push次のエラーで失敗します。
error: dst refspec refs/heads/<branch>> matches more than one
error: failed to push some refs to 's3://<bucket>/<prefix>'
この問題を解決するには、 git-remote-s3 doctor <s3-uri>コマンドを実行します。デフォルトでは、保持すべきでないバンドルごとに新しいブランチが作成されます。その後、ユーザーはブランチをローカルでチェックアウトし、元のブランチにマージできます。代わりにバンドルを削除する場合は、 --delete-bundleを指定します。
LFS の S3 リモートを使用してリポジトリのクローンを作成する場合、設定をまだ追加していないため、 git-lfsファイルをフェッチする方法を知りません。
これには 2 つの追加手順が必要です。
% git clone s3://my-git-bucket/lfs-repo lfs-repo-clone
Error downloading object: file.tiff (54238cf): Smudge error: Error downloading file.tiff (54238cfaaaa42dda05da0e12bf8ee3156763fa35296085ccdef63b13a87837c5): batch request: ssh: Could not resolve hostname s3: Name or service not known: exit status 255
...修正するには:
cd lfs-repo-clone
lfs-s3-py install
git reset --hard main使用されなくなったリモート ブランチを削除するにはgit-s3 delete-branch <s3uri> -b <branch_name>コマンドを使用できます。このコマンドは、ブランチ パスの下の Amazon S3 からバンドル オブジェクトを削除します。
ブランチを保護/保護解除するには、 git s3 protect <remote> <branch-name>をそれぞれ実行しますgit s3 unprotect <remote> <branch-name> 。
バンドルは、S3 バケットに<prefix>/<ref>/<sha>.bundleとして保存されます。
リモート ref をリストするとき (たとえば、 git ls-remoteを介して明示的に)、指定された の下に存在するすべてのキーをリストします。
新しい ref (コミットなど) をプッシュすると、ref の sha を取得し、 git bundle create <sha>.bundle <ref>を介して ref をバンドルし、上記のスキーマに従って S3 に保存します。
プッシュが成功すると、コードは ref に関連付けられた以前のバンドルを削除します。
2 人のユーザーが同じ現在のブランチ ヘッドに基づくコミットをリモートに同時にプッシュすると、両方のバンドルがリポジトリに書き込まれ、現在のバンドルが削除されます。データは失われませんが、1 つを除くすべてのバンドルが削除されるまで、それ以上プッシュすることはできません。これには、 git s3 doctor <remote>コマンドを使用できます。
LFS 統合は、リモート URI によって定義されたバケット内のキー<prefix>/lfs/<oid>の下にファイルを保存します。ここで、oid は git-lfs によってファイルに割り当てられた一意の識別子です。
同じキーを持つオブジェクトがすでに存在する場合、git-lfs-s3 はそれを再度アップロードしません。
--verboseフラグを使用して、git 操作の実行時にデバッグ情報を出力します。ログは標準エラー出力に保存されます。
LFS 操作の場合、 git-lfs-s3 enable-debugおよびgit-lfs-s3 disable-debugを介してデバッグ ログをそれぞれ有効または無効にできます。ログはリポジトリの.git/lfs/tmp/git-lfs-s3.logに保存されます。
git S3 の統合は、git-remote-s3 に関する Bryan Gahagan の作業に触発されました。
LFS 実装は、@nicolas-graves による lfs-s3 の恩恵を受けました。 git-remote-s3 トランスポートを使用する必要がない場合は、そのプロジェクトを使用する必要があります。