Faça o checkout dos arquivos Git para um local fora do repositório


21

É possível fazer "checkout" para um local fora do repositório? O que quero dizer é um clone de uma ramificação sem o diretório ".git".

Por exemplo: Use git para gerenciar um site. Você edita alguns arquivos, confirma e copia os arquivos para um servidor Web via WebDAV. O caminho do WebDAV seria o local fora do repositório, que não deve conter o ".git".

Pode não ser o problema para o qual o git foi criado, mas isso é possível?

Respostas:


19

Sim, isso é certamente possível.

Digamos que eu tenho um repositório vazio nomeado /srv/production.gitno sistema / servidor de destino.

No sistema de destino, posso usar o comando cd /srv/production.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

Se eu estiver em um repositório não-nua, o comando será um pouco diferente. Digamos que eu tenho um repositório não-nua em /srv/testing. Para verificar que eu usariacd /srv/testing/.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

De fato, no meu sistema, eu até automatizo isso em um gancho pós-confirmação no meu production.gitrepositório. Portanto, quando você envia para production.gita versão mais recente, verifica automaticamente a raiz da web.

#!/bin/sh
#
# An example hook script that is called after a successful
# commit is made.
#
# To enable this hook, rename this file to "post-commit".

GIT_WORK_TREE=/srv/production-www/ git checkout -f
# ... misc other commands to verify permissions are set correctly.

Se o seu único acesso ao sistema remoto for webdav, certamente será possível escrever um gancho pós-confirmação que fará o checkout no host webdav, diretamente ou em um local temporário, no qual você poderá criar um script para upload.


procurou em vários lugares .. única solução de trabalho, também limpa!
— karthikeayan

6

Se você apenas deseja os arquivos, pode usar git archive. Geralmente, ele grava em um arquivo como tarballs ou ZIP, mas você também pode canalizá-lo:

git archive master | tar -x -C /some/path

Aqui, masterobviamente , é o ramo que você deseja arquivar e /some/pathconterá apenas os arquivos - nenhum .gitou .gitignore.


Ou você pode usar o git checkout-indexque mais se assemelha a um "checkout" de arquivos:

git checkout-index -f -a --prefix=/some/path/

Aqui, a -aopção informa gitpara verificar todos os arquivos. O prefixo será anexado à saída. Alguém também escreveu um wrapper para dar a git export.


2
Eu acho que você está tornando isso mais difícil do que precisa ser. Basta executar GIT_WORK_TREE=/destinationpath git checkout -fenquanto o diretório atual estiver no topo de um repositório vazio ou no subdiretório .git. Você fará um checkout em / destinationpath
— Zoredache

Ok, devo ter perdido de alguma forma essa opção, +1 para você.
— slhck

11
Acho essa opção muito mais intuitiva, para ser sincero. E menos propenso a erros.
— Minix
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.