Uma solução poderia ser usar os filtros smudge
e clean
do git.
Esta solução tem algumas desvantagens, porém, a que chegaremos mais tarde.
Você precisará escrever dois scripts que atuam como filtros, ou seja, ler da entrada padrão e gravar na saída padrão. Da documentação:
A filter driver consists of a clean command and a smudge command, either of which can be left unspecified. Upon checkout, when the smudge command is specified, the command is fed the blob object from its standard input, and its standard output is used to update the worktree file. Similarly, the clean command is used to convert the contents of worktree file upon checkin.
Por exemplo, ao usar o openssl, podemos gravar os arquivos fooenc.sh
:
#!/bin/sh
openssl enc -bf -nopad -pass pass:1KjeHD8d6YUI80bIIEAQ9iYr@njqLw3T
e foodec.sh
:
#!/bin/sh
openssl enc -bf -nopad -d -pass pass:1KjeHD8d6YUI80bIIEAQ9iYr@njqLw3T
Note que estes scripts devem ser mantidos fora do repositório e que eles devem ser mantidos secret desde que contenham a chave! Caso contrário, são convenientes porque não pedem uma senha todas as vezes que são chamadas.
Uma alternativa um pouco mais segura pode ser usar o GPG.
No arquivo .git/config
em seu repositório, você deve especificar esses filtros;
[filter "crypt"]
clean = fooenc.sh
smudge = foodec.sh
Isso não é um erro de digitação! Veja o excerto da documentação acima. Esta configuração criptografa os dados no check-in e descriptografa no check-out.
Em seguida, no arquivo .git/info/attributes
do repositório, você especifica o uso desse filtro para todos os arquivos;
* filter=crypt
Contanto que os scripts de filtragem estejam disponíveis, o diretório de trabalho conterá arquivos legíveis. Mas os objetos do git serão criptografados.
Note que isso impede que eles sejam utilizados os arquivos em qualquer máquina que não possua os scripts necessários. Então bitbucket só funciona como um armazenamento.
Agora, o lado negativo; Esta solução também faz ferramentas como git diff
e tudo o que depende disso inútil , já que os objetos do git agora são blobs criptografados.
Editar: Existem utuilidades como git-crypt ou git-encrypt para ajudá-lo a criptografar o conteúdo do seu repo.
E há uma solução para o problema do diff; usando um filtro especial para diffs; usando textconv com um script adicional para descriptografar os blobs antes que eles sejam dife- rados.