Quero colocar meu diretório pessoal (~) sob controle de origem (git, neste caso), pois tenho muitos arquivos de configuração (.gitconfig, .gitignore, .emacs, etc.) por lá, gostaria de transportar máquinas, tê-los no Git seria bom para recuperá-los.
Minha máquina principal é o meu MacBook e, da maneira como o OS X está configurado, há muitas pastas que eu quero ignorar (Documentos, Downloads, .ssh). Também existem pastas que já estão usando o Git (.emacs.d).
Meu pensamento era apenas adicionar todos esses diretórios ao meu arquivo .gitignore, mas isso parece meio cansativo e pode levar a consequências imprevisíveis. Meu próximo pensamento era copiar periodicamente os arquivos que eu quero armazenar em alguma pasta da casa e confirmar essa pasta. O problema com isso será que eu tenho que lembrar de movê-los antes de cometer.
Existe uma maneira limpa de fazer isso?
fonte
Respostas:
Eu tenho
$HOME
sob git. A primeira linha do meu arquivo .gitignore éO restante são padrões para não ignorar usando o
!
modificador. Essa primeira linha significa que o padrão é ignorar todos os arquivos no meu diretório pessoal. Esses arquivos que eu quero controlar a versão entram.gitignore
assim:Um padrão mais complicado que tenho é:
Ou seja, eu só quero a versão
.ssh/config
- não quero que minhas chaves e outros arquivos no .ssh entrem no git. O acima é como eu consegui isso.Editar: barras adicionadas ao início de todos os caminhos. Isso faz com que os padrões de ignorar correspondam na parte superior do repositório ($ HOME) em vez de em qualquer lugar. Por exemplo, se
!lib/
era um padrão (não ignore tudo no diretório lib) e você adicionava um arquivo.gitignore
, anteriormente o padrão (!.gitignore
) correspondia a ele. Com a barra (!/.gitignore
), ela corresponderá apenas.gitignore
no meu diretório pessoal e não em nenhum subdiretório.Não vi um caso em que isso faça uma diferença prática na minha lista de ignorados, mas me parece ser tecnicamente mais preciso.
fonte
O que faço (com os mesmos objetivos) é colocar meus arquivos de configuração em um subdiretório
~/lib
e ter links simbólicos no meu diretório pessoal, por exemplo.emacs -> lib/emacs/dot.emacs
,. Eu apenas mantenho os arquivos de configuração que escrevi explicitamente sob controle de versão; meu diretório pessoal contém muitos arquivos de pontos criados automaticamente que não estão sob controle de versão. Assim,~/lib
está sob controle de versão e meu diretório inicial não.Eu tenho um script que cria os links simbólicos dos arquivos em
~/lib
. Quando crio uma conta em uma nova máquina, preencha-a fazendo check-out~/lib
e executando esse script.Minha experiência é com CVS, não com git, portanto não é 100% transferível. Uma das razões pelas quais eu não coloquei meu diretório inicial diretamente no CVS é que isso
~/.cvsignore
se aplicaria a todos os meus checkout do CVS e não apenas ao meu diretório inicial; O git não tem esse problema. A desvantagem dessa abordagem, em comparação com o diretório inicial sob controle de versão, é que você não podegit status
distinguir entre um arquivo que você decidiu explicitamente ignorar (que seria listado no arquivo ignorar, portanto não exibido) e um arquivo sobre o qual você não tem opinião (que seria exibido com a?
).Alguns arquivos precisam ser diferentes em máquinas diferentes. Eu os coloquei em um diretório chamado
~/Local/SITENAME/lib
e crie links simbólicos para eles também ou (para os formatos de arquivo que o suportam) têm uma diretiva de inclusão no arquivo em~/lib
. Eu também tenho um link simbólico~/Here -> ~/Local/SITENAME
. Como o git, diferentemente do CVS, foi projetado para suportar repositórios quase similares, mas não idênticos, pode haver uma maneira melhor de gerenciar arquivos específicos da máquina. Na verdade, alguns dos meus arquivos de ponto não são links simbólicos, mas são gerados automaticamente a partir de conteúdo sob~/lib
e~/Here
.fonte
~/.gitignore
. Sem essa configuração, o arquivo não é aplicado a nenhum repositório, exceto aquele armazenado~/.git
(mesmo assim, não se aplicaria aos sub-repositórios). Eu uso core.excludesfile =~/.git-user-excludes
para evitar o conflito entre as exclusões que quero aplicar a todos os meus repositórios Git (independentemente da localização) e as exclusões que quero aplicar ao repositório que contém (partes do) meu diretório pessoal.gitignore
página do manual: “Padrões lidos em um arquivo .gitignore no mesmo diretório que o caminho ou em qualquer diretório pai (…)” De fato, ele pára na raiz do checkout (ou seja, onde o.git
diretório é)?.gitignore
arquivos é limitada pela raiz da árvore de trabalho. A frase que você citou continua: “(até o nível superior da árvore de trabalho)”.Podemos usar a capacidade do Git para continuar rastreando arquivos, mesmo que estejam listados
.gitignore
. Portanto, isso é suficiente para.gitignore
:Para cada arquivo que você deseja rastrear, execute
add -f
(o-f
parâmetro substitui a ignorância de in.gitignore
e.git/info/exclude
):Depois de indexar um arquivo, o Git rastreará todas as alterações, apesar do fato de o arquivo ser ignorado. O mesmo funciona para um diretório, mas apenas para os arquivos realmente presentes:
Se você deseja rastrear um diretório inteiro com todos os novos arquivos que aparecem nele, ele pode ser excluído de
.gitignore
uma maneira descrita na resposta por camh :Se você quiser parar de rastrear um arquivo, esse comando remove um arquivo do índice do Git, mas o deixa intocado no disco rígido:
fonte
Eu uso o antigo
rcs
para isso.Ter um olhar para manpages para
ci
,co
, ercs
. Esses sites também devem ser úteis:Eu uso isso para controlar a versão dos meus dotfiles, por exemplo:
E se eu quiser editá-los:
Eu recomendo criar um diretório nomeado
RCS
no seu~
, então você pode facilmente fazer backup desse diretório em algum lugar.fonte
$HOME/.conf/
Verifico meus arquivos de configuração em um repositório do BitBucket Mercurial. Um repositório do GitHub também funcionaria.O
~/.conf
checkout contém arquivos de configuração e um script de shell para preencher links simbólicos em$HOME
cada arquivo~/.conf
. Para formatos de configuração que suportam inclusão (.bashrc
,.inputrc
,.vimrc
, etc.) I incluem o~/.conf
arquivo em vez de um link para ele, para que eu possa fazer substituições locais.Para alguns arquivos de configuração, vinculo-o a um arquivo na minha pasta Dropbox e os compartilho via dropbox.
Por alguns meses, tentei me manter
$HOME
no controle de versão, mas cansei de gerenciar as enormes listas de ignorados, cansei de verificar as alterações de configuração feitas pelos aplicativos em execução, e o resultado nem era algo que gostaria de verificar em outro computador. Você pode imaginar a fixação conflitos mais~/.gconf
ou~/.config/monitors.xml
ou restauração fro versões de aplicativos de desktop diferentes?Acho mais fácil vincular um link simbólico ou incluir uma lista limitada de arquivos de configuração que eu personalizei pessoalmente e quero compartilhar nas máquinas como padrões globais.
fonte
Acabei de começar a usar o seguinte script Python Dotfiles, que é uma ferramenta útil que vincula automaticamente os arquivos para você: https://pypi.python.org/pypi/dotfiles
fonte
Eu acho que o seu segundo palpite de ter uma pasta não relacionada sob controle de origem é bom.
Basta adicionar 2 scripts de shell lá. Um para copiar arquivos sob seu controle
~
e outro para coletar arquivos~
e copiá-lo de volta para a pasta controlada por origem e confirmar.fonte
Aqui está um pequeno script ruby que eu uso para configurar uma nova máquina
fonte