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.