programing

Agit repo를 완벽하게 백업하시겠습니까?

i4 2023. 7. 10. 22:00
반응형

Agit repo를 완벽하게 백업하시겠습니까?

모든 분기 및 태그를 포함한 전체 Git repo를 백업할 수 있는 간단한 방법이 있습니까?

git bundle

저는 그 방법이 마음에 들어요. 하나의 파일만 복사할 수 있고, 더 쉽게 복사할 수 있기 때문입니다.
ProGit: 작은 기쁨 묶음을 참조하십시오.
자세한 내용은 "다른 사용자에게 agit 저장소를 이메일로 전송하려면 어떻게 해야 합니까?"를 참조하십시오.

git bundle create /tmp/foo-all --all

상세 정보:

git bundlegit 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가 서로 다른 하드 드라이브인지 확인하십시오. 그렇지 않으면 그렇게 하는 것이 그다지 의미가 없습니다.

다음 두 가지 옵션이 있습니다.

  1. gitrepo 디렉토리는 repoon 서버의 전체 내용을 포함하므로 tar를 직접 가져올 수 있습니다.백업을 수행하는 동안 다른 사용자가 repo 작업을 수행할 가능성이 약간 있습니다.

  2. 다음 명령은 서버에서와 마찬가지로 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

반응형