Eu tenho uma idéia incomum de usar o git como um sistema de backup. Então, digamos que eu tenho um diretório ./backup/myfiles e quero fazer backup usando o git. Para manter as coisas limpas, não quero ter um diretório .git na pasta myfiles, então pensei em criar ./backup/git_repos/myfiles. Analisando os documentos do git, tentei fazer o seguinte:
$ cd backup/myfiles
$ mkdir ../git_repos/myfiles
$ git --git-dir=../git_repos/myfiles init
Initialized empty Git repository in backup/git_repos/myfiles/
$ git --git-dir="../git_repos/myfiles/" add foo
fatal: pathspec 'foo' did not match any files
Você pode ver a mensagem de erro que chego lá. O que estou fazendo de errado?
Respostas:
Isso fará o que você deseja, mas obviamente será péssimo quando você precisar especificá-lo com todos os comandos git que você usar.
Você pode exportar
GIT_WORK_TREE=.
e oGIT_DIR=../backup
Git irá buscá-los em cada comando. Isso permitirá que você trabalhe confortavelmente em um único repositório por shell.Prefiro sugerir a ligação simbólica do diretório .git para outro lugar ou a criação de um link simbólico para o diretório .git a partir do diretório principal de backup.
fonte
Você só precisa garantir que o repositório saiba onde está a árvore de trabalho e vice-versa.
Para que o repositório saiba onde está a árvore de trabalho, defina o valor da configuração
core.worktree
. Para que a árvore de trabalho saiba onde está o diretório git, adicione um arquivo chamado .git (não uma pasta!) E adicione uma linha comoDesde o git 1.7.5, o comando init aprendeu uma opção extra para isso.
Você pode inicializar um novo repositório separado com
Isso inicializará o repositório git no diretório separado e adicionará o arquivo .git no diretório atual, que é o diretório de trabalho do novo repositório.
Anteriormente à 1.7.5, era necessário usar parâmetros ligeiramente diferentes e adicionar o arquivo .git.
Para inicializar um repositório separado, o seguinte comando vincula a árvore de trabalho ao repositório:
Seu diretório atual será a árvore de trabalho e o git usará o repositório em
/path/to/repo.git
. O comando init definirá automaticamente ocore.worktree
valor conforme especificado com o--git-dir
parâmetroVocê pode até adicionar um alias para isso:
Use o controle de versão git em um diretório de trabalho somente leitura
Com o conhecimento acima, você pode configurar o controle de versão git para um diretório ativo sem ter permissões de gravação. Se você usar
--git-dir
todos os comandos git ou executar todos os comandos do repositório (em vez do diretório ativo), poderá deixar de fora o arquivo .git e, portanto, não precisará criar nenhum arquivo no diretório ativo. Veja também a resposta do Leosfonte
core.worktree
Obviamente, o valor da configuração é armazenado no arquivo de configuração da pasta .git, para onde o arquivo .git aponta.fatal: core.worktree and core.bare do not make sense
. Parece que apenas alterar a configuração para que não fique vazio resolve isso.A
--separate-git-dir
opção paragit init
(egit clone
) pode ser usada para fazer isso na minha versão do git (1.7.11.3
). A opção separa o repositório git da árvore de trabalho e cria um link simbólico independente do sistema de arquivos git (na forma de um arquivo chamado.git
) na raiz da árvore de trabalho. Eu acho que o resultado é idêntico à resposta dos niks .fonte
init
si parece mais limpo e mais clararepo.git
é criado com seu conjunto de atributos hiden. Eu então mudo manualmente. Você sabe se isso é seguro?Acho mais simples reverter os diretórios
--work-tree
e--git-dir
usados na resposta do niks:Essa abordagem tem duas vantagens:
.git
arquivos de linha de comando . Você apenas opera normalmente de dentro da raiz do repositório.A única ressalva que encontrei é que, em vez de usar um
.gitignore
arquivo, você editainfo/exclude
.Você pode usar o repositório
read_only_repos/foo
como um controle remoto em seus próprios repositórios, mesmo que os arquivos originais não estejam sob controle de versão.fonte
É convencional nomear um diretório que seja um repositório git que tenha sua árvore de trabalho em um local incomum com uma extensão '.git', como um repositório vazio.
Se você tivesse fornecido a
--work-tree
opção no momento do init, isso configuraria automaticamente acore.worktree
variável de configuração, o que significa que o git saberá onde encontrar a árvore de trabalho depois de especificar o diretório git.Mas você também pode definir essa variável após o fato.
Depois de fazer isso, o comando add deve funcionar como esperado.
fonte
Use
git
dentro do repositório:A partir de agora, você pode usar
git
dentro do./backup/git_repos/myfiles
diretório, sem definir nenhuma variável de ambiente ou parâmetros adicionais.fonte
warning: core.bare and core.worktree do not make sense
, isso significa que não funcionou?core.bare
afalse
tarde.Você pode criar um script "nodgit" (No Dot GIT) com algo como
Você pode chamar nodgit no lugar do git e ele definirá as variáveis conforme necessário, procurando um repositório git. Por exemplo, digamos que você tenha um repositório (vazio) em / usr / local / gits / __ home__foo_wibbles e você esteja em / home / foo / wibbles / one, ele encontrará o diretório de trabalho correto (/ home / foo / wibbles) e repositório .
Ah, você também pode usar "nodgit shell" para obter um shell com os vars corretos definidos, para que você possa usar comandos git antigos e simples.
fonte
Supondo que seus
myfiles
diretórios já existam e tenham algum conteúdo, você poderia conviver com isso:O
.git
diretório estará dentrobackup
, não dentromyfiles
.fonte
git
rastrear usando o.gitignore
arquivo. Se você adicionar*
e!myfiles
a ele, apenas esse diretório será rastreado. Mas se você quer um repo separado para outro diretório, você teria um problema ...Eu crio scripts que parecem
~ / bin / barra-git:
É redundante usar --git_dir = $ GIT_DIR, mas me lembra que também posso definir variáveis de ambiente fora do script.
O exemplo acima é para rastrear alterações locais nos arquivos do sistema cygwin.
Pode criar um desses scripts para qualquer projeto importante que precise disso - mas / sem /.git é o meu principal uso.
O acima é pequeno o suficiente para criar um apelido ou função de shell, se você eliminar a redundância.
Se eu fizer isso com bastante frequência, reviveu o espaço de trabalho para repositório de mapeamento de
cuja contraparte moderna mais próxima são os mapeamentos ou visualizações do Perforce , suportando checkouts parciais, bem como a não colocação de espaço de trabalho e repo.
fonte