Agit repo를 완벽하게 백업하시겠습니까?
모든 분기 및 태그를 포함한 전체 Git repo를 백업할 수 있는 간단한 방법이 있습니까?
git bundle
저는 그 방법이 마음에 들어요. 하나의 파일만 복사할 수 있고, 더 쉽게 복사할 수 있기 때문입니다.
ProGit: 작은 기쁨 묶음을 참조하십시오.
자세한 내용은 "다른 사용자에게 agit 저장소를 이메일로 전송하려면 어떻게 해야 합니까?"를 참조하십시오.
git bundle create /tmp/foo-all --all
상세 정보:
git bundle
git show-ref로 표시되는 참조만 패키징합니다. 여기에는 헤드, 태그 및 원격 헤드가 포함됩니다.
사용된 근거가 목적지에 의해 유지된다는 것은 매우 중요합니다.
번들 파일에 대상에 이미 있는 개체가 포함되어 있으면 주의가 필요하지 않습니다. 이러한 개체는 대상에서 압축을 풀 때 무시되기 때문입니다.
해당 번들을 사용하는 경우 해당 번들을 복제하여 존재하지 않는 폴더(Git repo 외부)를 지정할 수 있습니다.
git clone /tmp/foo-all newFolder
그냥 그것을 복제하는 것은 어떻습니까?
git clone --mirror other/repo.git
모든 리포지토리는 원격의 백업입니다.
킹크런치와 VonC의 훌륭한 답변에 대해 자세히 알아봅니다.
두 가지를 결합했습니다.
git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all
에는 그다는다같파있습다니일라는 이 있습니다.reponame.bundle
쉽게 복사할 수 있습니다.그런 다음 다음 다음을 사용하여 해당 저장소에서 새 일반 Git 저장소를 생성할 수 있습니다.git clone reponame.bundle reponame
.
:git bundle
저장소의 일부 참조(태그 또는 태그)로 이어지는 커밋만 복사합니다.따라서 서로 엉키는 커밋은 번들에 저장되지 않습니다.
다른 몇 가지 답변에 대해서는 다음과 같이 설명합니다.
합니다.git clone --mirror user@server:/url-to-repo.git
백업을 고치고 때 그런다백새고때싶을고치로업을:git remote update
복제 위치에서.
이렇게 하면 나중에 추가되는 새 분기를 포함하여 모든 분기와 태그가 백업되지만 삭제되는 분기는 복제본에서 삭제되지 않습니다(백업에 유용할 수 있음).
이것은 원자력이기 때문에 단순한 복사만큼의 문제는 없습니다.
http://www.garron.me/en/bits/backup-git-bare-repo.html 을 참조하십시오.
이 스레드는 Git Repos의 백업을 수행하는 방법에 대한 통찰력을 얻는 데 큰 도움이 되었습니다.스스로 '올바른 방법'(tm)을 찾기에는 아직 힌트나 정보, 결론이 부족하다고 생각합니다.그래서 다른 사람들을 돕기 위해 제 생각을 여기에 공유하고 그들을 향상시키기 위해 토론에 올립니다.감사해요.
그래서 원래 질문을 집어 드는 것부터 시작합니다.
- 목표는 Git 저장소의 "전체" 백업에 최대한 근접하는 것입니다.
그런 다음 일반적인 바람으로 값을 조정하고 몇 가지 사전 설정을 지정합니다.
- 서비스 다운타임을 방지하기 위해 "핫 카피"를 통한 백업이 선호됩니다.
- git의 단점은 추가 명령에 의해 해결될 것입니다.
- 스크립트는 단일 백업에 대한 여러 단계를 결합하고 사용자의 실수(유형 등)를 방지하기 위해 백업을 수행해야 합니다.
- 또한 스크립트가 복원을 수행하여 대상 시스템에 덤프를 적용해야 합니다. 예를 들어, 원래 시스템의 구성이 백업 이후에 변경되었을 수도 있습니다.
- 환경은 하드 링크를 지원하는 파일 시스템이 있는 Linux 시스템의 깃 서버입니다.
"전체" Git repo 백업이란 무엇입니까?
"100%" 백업이 무엇인지에 따라 관점이 다릅니다.여기 두 가지 전형적인 것이 있습니다.
#1 개발자의 관점
- 내용물
- 레퍼런스
git는 개발자 도구이며 다음을 통해 이 관점을 지원합니다.git clone --mirror
그리고.git bundle --all
.
#2 관리자의 관점
- 콘텐츠 파일
- 경우 "수집 팩( ).
git gc
)
- 경우 "수집 팩( ).
- 칫 치
- https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain 을 참조하십시오.
- 문서: mangit-config, mangit ignore
- .git/config
- .git/description(예: 수신 후 전자 메일 후크, Gitolite, GitWeb 등)
- .git/smart/
- .git/info/ (파일 제외 등)
- 선택 사항: OS 구성(파일 시스템 권한 등)
git는 개발자 도구이며 관리자에게 이를 맡깁니다.Git 구성 및 OS 구성의 백업은 콘텐츠의 백업과 분리된 것으로 간주해야 합니다.
테크닉
- "콜드 카피"
- 서비스를 중지하여 해당 파일에 대한 단독 액세스 권한을 가집니다.다운타임!
- "핫 카피"
- 서비스는 백업 목적으로 고정 상태를 제공합니다.지속적인 변경은 해당 상태에 영향을 주지 않습니다.
생각해야 할 다른 주제들
대부분 백업용으로 일반적으로 사용됩니다.
- 전체 백업을 저장할 공간이 충분합니까?몇 세대가 저장됩니까?
- 점진적 접근법이 필요합니까?몇 세대에 걸쳐 저장되며 언제 다시 전체 백업을 생성해야 합니까?
- 백업이 생성된 후 또는 시간이 경과해도 손상되지 않았는지 확인하는 방법은 무엇입니까?
- 파일 시스템이 하드 링크를 지원합니까?
- 단일 아카이브 파일에 백업을 저장하거나 디렉토리 구조를 사용하시겠습니까?
Git가 백업 컨텐츠에 제공하는 기능
git gc --auto
- 문서: mangit-gc
- 리포지토리를 정리하고 압축합니다.
git bundle --all
- 문서: mangit-rev-list, mangit-rev-list
- Atomic = "핫 카피"
- 번들은 덤프 파일이며 git(검증, 복제 등)과 함께 직접 사용할 수 있습니다.
- 증분 추출을 지원합니다.
- 다음을 통해 확인 가능
git bundle verify
.
git clone --mirror
- 문서: mangit-clone, mangit-fsck, git clone --mirror와 git clone --bare의 차이점은 무엇입니까?
- Atomic = "핫 카피"
- 미러는 실제 git 저장소입니다.
- 이 명령의 주요 목적은 원래 저장소에서 정기적으로 업데이트를 가져오는 전체 활성 미러를 구축하는 것입니다.
- 공간 낭비를 방지하기 위해 동일한 파일 시스템의 미러에 대한 하드 링크를 지원합니다.
- 다음을 통해 확인 가능
git fsck
. - 미러는 전체 파일 백업 스크립트의 기초로 사용할 수 있습니다.
콜드 카피
콜드 카피 백업은 항상 전체 파일 백업을 수행할 수 있습니다. Git 저장소에 대한 모든 액세스를 거부하고 백업을 수행한 후 다시 액세스를 허용합니다.
- 발생 가능한 문제
- 파일 시스템을 통한 공유 액세스 등 모든 액세스를 거부하는 것은 쉽지 않을 수 있습니다.
- 레포가 단일 사용자가 있는 클라이언트 전용 시스템에 있더라도 자동 백업 실행 중에 사용자가 무언가를 커밋할 수 있습니다.
- 서버에서 다운타임이 허용되지 않을 수 있으며 여러 개의 대용량 저장소를 백업하는 데 시간이 오래 걸릴 수 있습니다.
- 완화를 위한 아이디어:
- 클라이언트가 동일한 컴퓨터에 있더라도 일반적으로 파일 시스템을 통해 직접 레포 액세스를 방지합니다.
- SSH/HTTP 액세스의 경우 git 권한 부여 관리자(예: gitolite)를 사용하여 스크립트 방식으로 액세스를 동적으로 관리하거나 인증 파일을 수정합니다.
- 저장소를 하나씩 백업하여 각 저장소의 다운타임을 줄입니다.하나의 레포를 거부하고 백업을 수행하고 다시 액세스를 허용한 다음 다음 레포를 계속합니다.
- 개발자의 동요를 방지하기 위해 유지관리 일정을 계획합니다.
- 리포지토리가 변경된 경우에만 백업합니다.구현하기 매우 어려울 수 있습니다. 예를 들어, 객체 목록과 팩 파일, 구성 및 후크 체크섬 등을 염두에 두고 있습니다.
핫카피
지속적인 커밋으로 인해 데이터가 손상될 위험이 있으므로 활성 리포지토리로는 파일 백업을 수행할 수 없습니다.핫 복사본은 백업 목적으로 활성 저장소의 고정 상태를 제공합니다.진행 중인 커밋은 해당 복사본에 영향을 주지 않습니다.위에 나열된 것처럼 Git의 클론 및 번들 기능이 이를 지원하지만 "100% 관리" 백업의 경우 추가 명령을 통해 몇 가지 작업을 수행해야 합니다.
"100% 관리" 핫카피 백업
- 1: 옵1: 사를 합니다.
git bundle --all
컨텐츠의 전체/증분 덤프 파일을 만들고 구성 파일을 복사/백업합니다. - 2: 옵2: 사를 합니다.
git clone --mirror
구성을 개별적으로 처리하고 복사한 다음 미러의 전체 파일 백업을 수행합니다.- 주의:
- 미러는 생성 시 현재 Git 템플릿으로 채워지는 새 리포지토리입니다.
- 구성 파일 및 디렉터리를 정리한 다음 원래 원본 리포지토리에서 구성 파일을 복사합니다.
- 백업 스크립트는 미러의 파일 권한과 같은 OS 구성을 적용할 수도 있습니다.
- 하드 링크를 지원하는 파일 시스템을 사용하고 원본 저장소와 동일한 파일 시스템에 미러를 생성하여 백업 중에 속도를 높이고 공간 소비를 줄입니다.
복원
- 대상 시스템 및 최신 "방법" 철학에 대한 Git 구성을 확인하고 채택합니다.
- 대상 시스템과 최신 "방법" 철학에 맞게 OS 구성을 확인하고 채택합니다.
정답은 IMO가 git clone --mirror입니다.그러면 레포가 완전히 백업됩니다.
Git clone mirror는 전체 저장소, 노트, 헤드, 참조 등을 복제하며 일반적으로 전체 저장소를 새 Git 서버에 복사하는 데 사용됩니다.이렇게 하면 모든 분기와 모든 항목, 전체 저장소가 삭제됩니다.
git clone --mirror git@example.com/your-repo.git
일반적으로 레포 복제에는 모든 분기가 포함되지 않고 마스터만 포함됩니다.
repo 폴더를 복사하면 가져온 분기만 "복사"됩니다.기본적으로 마스터 분기 또는 이전에 체크아웃한 다른 분기만 해당됩니다.
또한 Git bundle 명령어는 원하는 것이 아닙니다. "bundle 명령어는 일반적으로 git push 명령어로 와이어를 통해 푸시되는 모든 것을 이진 파일로 패키지화하여 누군가에게 이메일을 보내거나 플래시 드라이브에 저장한 다음 다른 저장소로 분리할 수 있습니다.(git clone --mirror와 git clone --bare의 차이점은 무엇입니까?)
이 든것이포있다습니에 들어 ..git
디렉토리입니다.다른 파일처럼 프로젝트와 함께 백업합니다.
git 번들 또는 복제 사용
git 디렉토리를 복사하는 것은 원자적이지 않기 때문에 좋은 해결책이 아닙니다.복사하는 데 시간이 오래 걸리는 큰 리포지토리가 있는데 다른 사용자가 리포지토리를 누르면 백업에 영향을 줍니다.복제하거나 번들을 만드는 데는 이 문제가 발생하지 않습니다.
Git-copy를 사용하여 Git repo를 최소 저장소 크기로 백업할 수 있습니다.
git copy /path/to/project /backup/project.repo.backup
그러면 다음을 사용하여 프로젝트를 복원할 수 있습니다.git clone
git clone /backup/project.repo.backup project
Python 툴은 공용 및 개인 저장소와 모든 지점을 저장하여 조직의 저장소를 .zip 형식으로 자동 백업하는 매우 간단한 도구입니다.Github API: https://github.com/BuyWithCrypto/OneGitBackup 에서 작동합니다.
cd /path/to/backupdir/
git clone /path/to/repo
cd /path/to/repo
git remote add backup /path/to/backupdir
git push --set-upstream backup master
이렇게 하면 백업이 생성되고 설정이 이루어지므로 원하는 백업을 업데이트할 수 있습니다./path/to/backupdir와 /path/to/repo가 서로 다른 하드 드라이브인지 확인하십시오. 그렇지 않으면 그렇게 하는 것이 그다지 의미가 없습니다.
다음 두 가지 옵션이 있습니다.
gitrepo 디렉토리는 repoon 서버의 전체 내용을 포함하므로 tar를 직접 가져올 수 있습니다.백업을 수행하는 동안 다른 사용자가 repo 작업을 수행할 가능성이 약간 있습니다.
다음 명령은 서버에서와 마찬가지로 repo의 기본 복제본을 제공합니다. 그러면 문제 없이 복제한 위치의 tar를 가져올 수 있습니다.
git clone --bare {your backup local repo} {new location where you want to clone}
Github에 있는 경우 비트 버킷으로 이동하고 "리포지토리 가져오기" 방법을 사용하여 Github repo를 개인 repo로 가져옵니다.
비트 버킷에 있으면 반대로 합니다.
전체 백업이지만 클라우드에 머무르는 것이 제 이상적인 방법입니다.
제가 알기로는 레포가 있는 디렉토리의 복사본을 만들 수 있는 것으로 알고 있습니다. 그게 다예요!
cp -r project project-backup
언급URL : https://stackoverflow.com/questions/5578270/fully-backup-a-git-repo
'programing' 카테고리의 다른 글
혼합된 분기의 차이점을 보시겠습니까? (0) | 2023.07.10 |
---|---|
SQL Server 특정 열의 모든 행에서 특정 단어 찾기 및 바꾸기 (0) | 2023.07.10 |
sql에서 주 번호를 추출하는 방법 (0) | 2023.07.10 |
Oracle SQL Developer의 이전 SQL 기록 (0) | 2023.07.10 |
Rubocop 선 길이:댓글이 달린 줄을 무시하는 방법은? (0) | 2023.07.10 |