Eu tenho um projeto que estou implantando no Heroku . A árvore do código-fonte inclui um monte de arquivos mp3 (o site será para um projeto de gravação com o qual eu estava muito envolvido).
Eu gostaria de colocar o código-fonte no GitHub , mas o GitHub tem um limite de 300 MB em suas contas gratuitas. Não quero usar 50 MB do meu limite em vários arquivos mp3. Obviamente, eu poderia adicioná-los ao .gitignore
arquivo para mantê-los fora do meu repositório.
No entanto, eu implanto no Heroku usando git push heroku
. Os arquivos mp3 devem estar presentes no ramo que envio ao Heroku para que eles sejam implantados.
Idealmente, eu gostaria .gitignore
dos arquivos mp3 em minha ramificação principal local, para que quando eu enviar isso para o GitHub, os mp3s não sejam incluídos. Então, eu manteria um ramo de produção local que tenha os mp3s confirmados em vez de ignorados. Para implantar, eu mesclaria o mestre na produção e depois enviaria o ramo de produção para o Heroku.
Não consigo fazer isso funcionar direito.
Aqui está um exemplo do que estou tentando fazer ...
$ git init git-ignore-test
$ cd git-ignore-test
$ echo "*.ignored" >> .gitignore
$ git add .gitignore && git commit -m "Ignore .ignored files"
$ touch Foo.ignored
Neste ponto, Foo.ignored é ignorado em minha ramificação principal, mas ainda está presente, para que meu projeto possa usá-lo.
$ git checkout -b unignored
$ cat /dev/null > .gitignore
$ git add Foo.ignored .gitignore && git commit -m "Unignore .ignored files"
Agora eu tenho uma ramificação com esses arquivos confirmados, como eu quero. No entanto, quando volto ao meu ramo principal, o Foo.ignored se foi.
Alguém tem alguma sugestão para uma maneira melhor de configurar isso?
Editar: apenas para esclarecer, quero que os arquivos mp3 estejam presentes nos dois ramos para que, quando eu executo o site localmente (usando um dos ramos), o site funcione. Eu só quero que os arquivos sejam ignorados em uma ramificação; portanto, quando eu envio para o GitHub, eles também não são enviados. Normalmente, o .gitignore funciona bem para esse tipo de coisa (ou seja, manter uma cópia local de um arquivo que não é incluído em um envio para um controle remoto), mas quando eu alterno para o ramo com os arquivos verificados e, em seguida, de volta ao arquivo Quando os arquivos são ignorados, os arquivos desaparecem.
Respostas:
Eu escrevi um post no blog sobre como usar efetivamente o
excludesfile
para diferentes ramos, como um para o github público e outro para a implantação do heroku.Aqui está o rápido e sujo:
depois, no arquivo .git / config, adicione estas linhas:
Agora, todo o material de ignorado global está no
info/exclude
arquivo e o ramo específico está noinfo/exclude_from_public_viewing
Espero que ajude!
http://cogniton-mind.tumblr.com/post/1423976659/howto-gitignore-for-different-branches
fonte
git init
, ...) e a versão do Git que você usou?Dica importante : a resposta aceita pelo Cognition.Mind não funciona (mais, há vários anos, ou talvez para versões baunilha do git); veja os comentários. Uma resposta válida e uma solução alternativa podem ser encontradas aqui:
https://stackoverflow.com/a/29583813/2157640
Outra solução alternativa (trabalhando para o meu problema específico, mas exigindo operações manuais de stash ou implementação de um gancho) seria
git stash -u -a
. Isso é entediante quando as diferenças são grandes.E, finalmente, a solução com a qual estou indo agora é bifurcar minha VM em que mantemos nosso ambiente de desenvolvimento e configurá-lo
info/excludes
adequadamente para a filial, excluindo respectivamente os arquivos / pastas ofensivos e não confirmados.fonte
Eu recomendaria fortemente considerar colocar esses arquivos MP3 no S3. Fazer com que eles façam parte do seu impulso Heroku (e, portanto, parte da sua lesma Heroku) diminuirá bastante o tempo de inicialização do dinamômetro. Como o Heroku usa o EC2, se os arquivos estiverem no S3 e forem acessados apenas pelo seu aplicativo (se os usuários não estiverem diretamente vinculados ao S3), você nem pagará nenhuma taxa de largura de banda, apenas a taxa para armazenar 50 MB.
fonte
Digamos que queremos ignorar a
build
pasta de todas as outras ramificações, excetoproduction
ramificação. Como queremos empurrarbuild
pasta na produção.1) Não inclua
build
no .gitignore. Se você fizer isso, será sempre ignorado em todos os ramos.2) Crie um arquivo
exclude_from_public_viewing
dentro da./.git/info
pasta (Esta pasta já existe)touch ./.git/info/exclude_from_public_viewing
3) Dentro,
exclude_from_public_viewing
escreva uma linha (como você está tentando ignorarbuild
para todos os ramos).!build
4) Existe um arquivo existente
.git/info/exclude
. Precisamos adicionar a seguinte linha.Queremos ignorar a
build
pasta, mas não a adicionamos ao .gitignore. Então, como o git saberá o que ignorar? A resposta é que estamos adicionando-o aoexclude
arquivo e passando condicionalmente esse arquivo paragit config
5) Agora temos que cancelar o registro condicional da
build
pasta paraproduction
ramificação. para fazer isso, execute os seguintes6) Existe um arquivo existente chamado
./.git/config
precisamos adicionar o seguinte -a)
excludesfile = +info/exclude
abaixo[core]
b) Criar uma nova seção no final de
./.git/config
comoExiste uma solução alternativa inteligente. Vamos dizer que você deseja adicionar uma
build/
pasta naproduction
ramificação e ignorá-la em todas as outras ramificações.1) Adicione-o ao seu
gitignore
arquivo.2) No ramo de produção, enquanto estiver fazendo
git add
, force a adição debuild
pasta:git add -f --all build/
fonte
branch.<name>.excludesfile
git (mais?), Apenas paracore.excludesfile
, e meus próprios testes pareciam afirmar isso.git version 2.7.4 (Apple Git-66)
e eu não useibranch.<name>.excludesfile
na minha solução.Você já tentou que o .gitignore fosse diferente em sua filial?
Você deve poder ignorar o que deseja com base na ramificação em que se encontra, desde que os arquivos não sejam rastreados nessa ramificação.
fonte
1. Resumo
Eu adiciono ao meu
.travis.yml
:Onde
misc
- qualquer pasta, contém outra.gitignore
.mv
Comando UNIX mover arquivo; substituir, se o arquivo já existir.Quando o Travis CI implanta um projeto, o Travis CI não avança para a implantação de arquivos e pastas do provedor , que são ignorados
misc/.gitignore
(não no original.gitignore
das fontes).2. Limitações
3. Relevância
Esta resposta é relevante para abril de 2018. No futuro, os dados desta resposta podem estar obsoletos.
4. Demonstração
meu projeto real .
Exemplo de implantação bem-sucedida .
4.1 Tarefa
Eu implanto meu projeto da ramificação src na ramificação dest do mesmo repositório.
Eu quero esse arquivo
PaletteMira.suricate-profile
:Se eu entendi corretamente o autor da pergunta, ele tem uma tarefa semelhante.
4.2 src
ramo de fontes - SashaYAML .
Parte de
.travis.yml
:Parte de
.gitignore
:Parte de
misc/.gitignore
*.suricate-profile
não emmisc/.gitignore
.PaletteMira.suricate-profile
não existe neste ramo remotamente, mas existe localmente.4.3 dest
agência de destino - SashaDevelop
Parte de
.gitignore
:*.suricate-profile
não emmisc/.gitignore
.PaletteMira.suricate-profile
existe para esse ramo remotamente e localmente.4.4 Passos para reproduzir
Habilito o repositório PaletteMira GitHub para o Travis CI → Defino a variável de ambiente
$GITHUB_TOKEN
com valor - meu token GitHub → Faço qualquer confirmação para minha ramificação src.Se não houver erros, devo obter o comportamento esperado .
fonte
Você pode se comprometer e empurrar do Heroku?
Por exemplo, adicione o áudio, empurre-o para o github e para o heroku, remova os arquivos da cópia de trabalho no Heroku. Remova o áudio do repositório, mas não do disco, depois empurre essa alteração de volta para o github.
fonte
Agora o Github tem suporte para armazenamento de arquivos grandes, veja mais aqui https://git-lfs.github.com/
fonte