이 라이브러리를 사용하면 Amazon S3를 git 원격 및 LFS 서버로 사용할 수 있습니다.
S3를 서버리스 Git 서버로 사용하기 위한 git 원격 도우미 구현을 제공합니다.
또한 LFS 관리 파일을 원격으로 사용되는 동일한 S3 버킷으로 푸시할 수 있도록 git-lfs 사용자 지정 전송 구현을 제공합니다.
git-remote-s3
은 Python 스크립트이며 Python 버전 >= 3.9에서 작동합니다.
달리다:
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를 설치해야 합니다. 시스템에서 이 작업을 수행하는 방법에 대한 공식 문서를 참조할 수 있습니다.
다음으로 repo 폴더에서 다음 명령을 실행하여 S3 통합을 활성화해야 합니다.
lfs-s3-py install
이는 다음의 지름길입니다.
git config --add lfs.customtransfer.lfs-s3-py.path lfs-s3-py
git config --add lfs.standalonetransferagent lfs-s3-py
TIFF 파일을 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
명령을 호출합니다. 두 개 이상의 git push
명령이 서로 다른 클라이언트에서 동시에 실행되는 경우 1단계에서 동일한 유효한 참조를 가져오므로 두 클라이언트 모두 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
로 저장됩니다.
원격 참조를 나열할 때(예: git ls-remote
통해 명시적으로) 주어진 ref 아래에 있는 모든 키를 나열합니다.
새 참조(예: 커밋)를 푸시할 때 참조의 sha를 가져오고, git bundle create <sha>.bundle <ref>
통해 참조를 번들링하고 위의 스키마에 따라 S3에 저장합니다.
푸시가 성공하면 코드는 참조와 연결된 이전 번들을 제거합니다.
두 명의 사용자가 동일한 현재 분기 헤드를 기반으로 하는 커밋을 원격으로 동시에 푸시하면 두 번들이 모두 저장소에 기록되고 현재 번들이 제거됩니다. 데이터는 손실되지 않지만 하나를 제외한 모든 번들이 제거될 때까지 더 이상 푸시할 수 없습니다. 이를 위해 git s3 doctor <remote>
명령을 사용할 수 있습니다.
LFS 통합은 <prefix>/lfs/<oid>
키 아래 원격 URI에 의해 정의된 버킷에 파일을 저장합니다. 여기서 oid는 git-lfs가 파일에 할당한 고유 식별자입니다.
동일한 키를 가진 객체가 이미 존재하는 경우 git-lfs-s3은 해당 객체를 다시 업로드하지 않습니다.
Git 작업을 수행할 때 일부 디버그 정보를 인쇄하려면 --verbose
플래그를 사용하세요. 로그는 stderr에 저장됩니다.
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 전송을 사용할 필요가 없다면 해당 프로젝트를 사용해야 합니다.