Existe uma maneira simples de fazer backup de um repositório Git inteiro, incluindo todas as ramificações e tags?
Existe uma maneira simples de fazer backup de um repositório Git inteiro, incluindo todas as ramificações e tags?
Respostas:
Que tal fazer um clone disso?
git clone --mirror other/repo.git
Todo repositório é um backup do seu controle remoto.
git branch -a
. Talvez seja mais óbvio assim: Após a clonagem de um repositório, você não busca todos os ramos, mas todos os commit. As ramificações fazem referência apenas a uma confirmação existente.
git clone
cobre tudo isso. (1) é opcional, não é um requisito. Se o resultado ainda estiver otimizado, ainda será um backup (2) já coberto pelo próprio git. - O ponto que gostaria de mencionar é que, se git clone
já abordamos os pontos relevantes, para o que você precisa de uma ferramenta diferente? Embora eu prefira também git bundle
, não acho que minha resposta seja errada ou inválida. Você pode ver as duas abordagens como backup a quente ou a frio.
git bundle
Eu gosto desse método, pois resulta em apenas um arquivo, mais fácil de copiar.
Veja ProGit: pequeno pacote de alegria .
Consulte também " Como posso enviar um repositório git para alguém por e-mail? ", Onde o comando
git bundle create /tmp/foo-all --all
é detalhado:
git bundle
empacotará apenas referências que são mostradas pelo git show-ref : isso inclui cabeças, tags e cabeças remotas.
É muito importante que a base usada seja mantida pelo destino.
É bom errar por precaução, fazendo com que o arquivo do pacote contenha objetos que já estão no destino, pois eles são ignorados ao descompactar no destino.
Para usar esse pacote, você pode cloná-lo, especificando uma pasta inexistente (fora de qualquer repositório git):
git clone /tmp/foo-all newFolder
git bundle
é a resposta correta na minha opinião, e não a aceita. Eu acho que ele conhece bem o comando clone, se ele pode fazer uma pergunta dessas, e claramente não é suficiente para ele (porque é um clone e não um despejo). Os despejos são coisas diferentes das cópias simples, por exemplo: 1) eles não precisam ser ótimos (ou mesmo capazes) para o trabalho normal 2) mas precisam ter uma boa resistência e capacidade de reparo contra corrupção de dados 3) Geralmente é útil se eles são facilmente flexíveis para backups incrementais, embora não seja um objetivo nas cópias.
git bundle
ou git clone
fica tudo , por exemplo, os scripts de gancho.
git bundle
em um repositório remoto?
Expandindo algumas outras respostas, é isso que eu faço:
Configure o repositório: git clone --mirror user@server:/url-to-repo.git
Então, quando você deseja atualizar o backup: git remote update
do local do clone.
Isso faz o backup de todas as ramificações e tags, incluindo as novas que são adicionadas posteriormente, embora seja interessante notar que as ramificações excluídas não são excluídas do clone (o que para um backup pode ser uma coisa boa).
Isso é atômico e, portanto, não tem os problemas que uma cópia simples teria.
Consulte http://www.garron.me/en/bits/backup-git-bare-repo.html
Expandindo as ótimas respostas de KingCrunch e VonC
Eu combinei os dois:
git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all
Depois disso, você tem um arquivo chamado reponame.bundle
que pode ser facilmente copiado. Você pode criar um novo repositório git normal a partir dele git clone reponame.bundle reponame
.
Observe que git bundle
apenas cópias confirmadas levam a alguma referência (ramificação ou tag) no repositório. Portanto, as confirmações de emaranhamento não são armazenadas no pacote.
git bundle create reponame.bundle --all
?
Tudo está contido no .git
diretório Faça o backup do seu projeto como faria com qualquer arquivo.
copy
ou cp
comanda muito bem e não atende às suas necessidades. E também acho que ele pensa em um repositório vazio (embora possa ser copiado também, acho que não é um backup completo).
use git bundle ou clone
copiar o diretório git não é uma boa solução, pois não é atômico. Se você tiver um repositório grande que leva muito tempo para copiar e alguém envia para o repositório, isso afetará o backup. A clonagem ou criação de um pacote configurável não terá esse problema.
Você pode fazer backup do repositório git com git-copy no tamanho mínimo de armazenamento.
git copy /path/to/project /backup/project.repo.backup
Em seguida, você pode restaurar seu projeto com git clone
git clone /backup/project.repo.backup project
git clone --bare
+ git push --force
.
A resposta correta IMO é git clone --mirror . Isso fará um backup completo do seu repositório.
O espelho de clone do Git clonará todo o repositório, notas, cabeças, refs, etc. e é normalmente usado para copiar um repositório inteiro para um novo servidor git. Isso abrirá todos os ramos e tudo, todo o repositório.
git clone --mirror git@example.com/your-repo.git
Normalmente, a clonagem de um repositório não inclui todas as ramificações, apenas o Mestre.
Copiar a pasta de repo apenas "copiará" as ramificações que foram puxadas ... então, por padrão, isso é apenas ramificação mestre ou outras ramificações que você efetuou check-out anteriormente.
O comando Git bundle também não é o que você deseja: "O comando bundle empacotará tudo o que normalmente seria enviado por fio com um comando git push em um arquivo binário que você pode enviar por e-mail para alguém ou colocar em uma unidade flash, e então desmembrar em outro repositório ". (De Qual é a diferença entre git clone --mirror e git clone --bare )
Esse encadeamento foi muito útil para obter algumas idéias de como os backups dos repositórios git poderiam ser feitos. Acho que ainda faltam algumas dicas, informações ou conclusões para encontrar o "caminho correto" (tm) para si mesmo. Portanto, compartilho meus pensamentos aqui para ajudar outras pessoas e colocá-las em discussões para melhorá-las. Obrigado.
Então, começando com a pergunta original:
Depois, enriquecendo-o com os desejos típicos e especificando algumas predefinições:
O ponto de vista difere do que é um backup "100%". Aqui estão dois típicos.
O git é uma ferramenta de desenvolvedor e suporta esse ponto de vista via git clone --mirror
e git bundle --all
.
git gc
)O git é uma ferramenta de desenvolvedor e deixa isso para o administrador. O backup da configuração do git e da configuração do sistema operacional deve ser visto como separado do backup do conteúdo.
A maioria deles é genérica para backups.
git gc --auto
git bundle --all
git bundle verify
.git clone --mirror
git fsck
.Um backup de cópia a frio sempre pode fazer um backup completo de arquivos: negar todos os acessos aos repositórios git, fazer backup e permitir acessos novamente.
Os backups de arquivos não podem ser feitos com repositórios ativos devido ao risco de dados corrompidos por confirmações contínuas. Uma cópia a quente fornece um estado fixo de um repositório ativo para fins de backup. As confirmações contínuas não afetam essa cópia. Conforme listado acima, as funcionalidades de clone e pacote configurável do git suportam isso, mas para um backup "100% admin" várias coisas precisam ser feitas por meio de comandos adicionais.
git bundle --all
para criar arquivos de despejo completo / incremental de conteúdo e copiar / fazer backup dos arquivos de configuração separadamente.git clone --mirror
, manipule e copie a configuração separadamente e faça o backup completo dos arquivos do espelho.
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
isso cria um backup e faz a configuração, para que você possa executar um git push para atualizar seu backup, o que provavelmente é o que você deseja fazer. Apenas certifique-se de que / path / to / backupdir e / path / to / repo sejam pelo menos diferentes discos rígidos, caso contrário, não faz muito sentido fazer isso.
Aqui estão duas opções:
Você pode pegar diretamente um tar do diretório git repo, pois ele tem todo o conteúdo do repositório no servidor. Há uma pequena possibilidade de que alguém possa estar trabalhando no repo enquanto faz backup.
O comando a seguir fornecerá o clone simples de repo (exatamente como no servidor), e você poderá obter um tar do local em que você clonou sem nenhum problema.
git clone --bare {your backup local repo} {new location where you want to clone}
Até onde eu sei, você pode simplesmente fazer uma cópia do diretório em que seu repositório está, é isso!
cp -r project project-backup
git clone --bare
fornecerá um instantâneo consistente.