Pergunta

Por um ano e meio, fui mantendo meus olhos na comunidade git na esperança de fazer o interruptor longe do SVN. Uma questão em particular me segurando é a incapacidade de bloquear arquivos binários. Ao longo do ano passado, eu ainda tenho que ver os desenvolvimentos sobre esta questão. Eu entendo que os arquivos de bloqueio vai contra os princípios fundamentais do controle de origem distribuídos, mas eu não vejo como uma empresa de desenvolvimento web pode tirar proveito de git para rastrear código fonte e arquivo de imagem muda quando existe o potencial para conflitos de arquivo binário.

Para alcançar os efeitos do bloqueio, um repositório de "central" deve ser identificada. Independentemente da natureza distribuída de git, a maioria das empresas terá um repositório de "central" para um projeto de software. Devemos ser capazes de marcar um arquivo como exigindo um bloqueio do repositório git governante em um endereço especificado. Talvez este é dificultada porque o conteúdo do arquivo faixas git não arquivos?

Algum de vocês tem experiência em lidar com git e arquivos binários que deve ser travado antes de modificação?

NOTA:. Parece projecto engrenagem da Fonte novo open source de controle de versão distribuído, veracidade, tem bloqueio como um de seus objetivos

Foi útil?

Solução

Git LFS 2.0 adicionou suporte para arquivo de bloqueio.

Com Git LFS 2.0.0 agora você pode bloquear arquivos que você está trabalhando ativamente em, impedindo outros de empurrar para o servidor Git LFS até que você desbloquear os arquivos novamente.

Isto irá prevenir conflitos de mesclagem, bem como trabalho perdido em arquivos não-habilitadas a serem fundidas no nível do sistema de arquivos. Embora possa parecer contradizer a natureza distribuída e paralela do Git, bloqueio de arquivos é uma parte importante do desenvolvimento de software muitos fluxos de trabalho, particularmente para equipes maiores que trabalham com ativos binários.

Outras dicas

Subversion tem fechaduras, e eles não são apenas consultivo. Elas podem ser aplicadas usando o atributo svn:needs-lock (mas pode também ser deliberadamente quebrado, se necessário). É a solução ideal para o gerenciamento de arquivos não habilitadas a serem fundidas. A empresa que eu trabalho para lojas de praticamente tudo no Subversion, e usos svn:needs-lock para todos os arquivos não-habilitadas a serem fundidas.

Não concordo com "bloqueios são apenas um método de comunicação". Eles são um método muito mais eficaz do que o push-notificações, tais como telefone ou e-mail. fechaduras Subversion são auto-documentadas (que tem o bloqueio). Por outro lado, se você tem de comunicar por outros canais de notificação push-tradicionais, tais como e-mail, que você enviar a notificação para? Você não sabe antecipadamente quem pode querer editar o arquivo, especialmente em projetos de código aberto, a menos que você tem uma lista completa de sua equipe de desenvolvimento inteiro. Então, esses métodos tradicionais de comunicação não são tão eficazes.

Um servidor trava central, enquanto contra os princípios da DVCS, é o único método viável para arquivos não-habilitadas a serem fundidas. Enquanto DVCS não tem uma função de bloqueio central, eu acho que vai manter o trabalho da empresa I para usar Subversion.

A melhor solução seria fazer uma ferramenta de mesclagem para todos os seus formatos de arquivos binários, mas isso é um longo prazo e meta permanente que nunca vai ser "acabado".

Aqui está uma leitura interessante sobre o tema.

Eu concordo que o bloqueio arquivos binários é uma característica necessária para alguns ambientes. Eu só tinha um pensamento sobre como implementar isso, porém:

  • Tenha uma maneira de marcar um arquivo como "needs-lock" (como o "svn: needs-lock" propriedade).
  • No check-out, git marcaria tal arquivo como somente leitura.
  • Uma nova git-lock comando entraria em contato com um servidor central de bloqueio correndo de um lugar para pedir permissão para bloqueio.
  • Se o servidor bloqueio concede permissão, marcar o arquivo de leitura e escrita.
  • git-add iria informar o servidor de bloqueio do hash do conteúdo do arquivo bloqueado.
  • O servidor bloqueio iria assistir para esse hash de conteúdo para aparecer em um commit no repositório principal.
  • Quando o aparece de hash, liberar o bloqueio.

Este é muito mais uma ideia cozido metade e há buracos potenciais em todos os lugares. Ele também vai contra o espírito do git, mas certamente pode ser útil em alguns contextos.

Dentro de uma organização particular, esse tipo de coisa talvez pudesse ser construído usando uma combinação adequada de wrappers script e cometer ganchos.

Em resposta à preocupação adicional de Mario com mudanças acontecendo em vários lugares sobre os binários. Assim, o cenário é Alice e Bob são ambos fazer mudanças para o mesmo recurso binário, ao mesmo tempo. Cada um deles tem seu próprio repo local, clonada a partir de um controle remoto central.

Este é realmente um problema em potencial. Então Alice termina primeiro e empurra para o ramo alice/update central. Normalmente, quando isso acontece, Alice faria um anúncio de que devem ser revistos. Bob vê que e comentários de TI. Ele pode (1) incorporar pessoalmente os alterações em sua versão (ramificação da alice/update e fazendo suas alterações para que) ou (2) publicar suas próprias alterações bob/update. Novamente, ele faz um anúncio.

Agora, se Alice empurra para master vez, Bob tem um dilema quando ele puxa master e tenta mesclar em sua filial local. Seus conflitos com Alice. Mas, novamente, o mesmo procedimento pode aplicar-se, apenas em diferentes ramos. E mesmo que Bob ignora todos os avisos e commits sobre Alice, é sempre possível retirar de Alice comprometer a consertar as coisas. Isto torna-se simplesmente um problema de comunicação.

Uma vez que (AFAIK) as fechaduras do Subversion são apenas consultivo, um e-mail ou mensagem instantânea pode servir a mesma finalidade. Mas mesmo se você não fizer isso, Git permite corrigi-lo.

Não, não há nenhum mecanismo de bloqueio per se. Mas um mecanismo de bloqueio tende a ser apenas um substituto para uma boa comunicação. Acredito que é por isso que os desenvolvedores Git não adicionou um mecanismo de bloqueio.

Nós temos apenas recentemente começou a usar Git (Subversion usado anteriormente) e eu encontrei uma mudança de fluxo de trabalho que ajuda poder com o seu problema, sem a necessidade de bloqueios. Ela tira proveito de como git é projetado e como ramos são fáceis.

Basicamente, tudo se resume a empurrar a um ramo não-mestre, fazendo uma revisão desse ramo, e depois se fundir no branch master (ou qualquer que seja o ramo alvo é).

A forma git é "pretende" ser utilizado, cada desenvolvedor publica seu próprio repositório público, que pedem outros para puxar. Descobri que os usuários do Subversion têm problemas com isso. Assim, em vez, eu empurro a filial de árvores no repositório central, com cada usuário ter sua própria árvore ramo. Por exemplo, uma hierarquia como este trabalho poder:

users/a/feature1
users/a/feature2
users/b/feature3
teams/d/featurey

Sinta-se livre para usar sua própria estrutura. Nota Eu também estou mostrando ramos tópico, outro idioma git comum.

Então, em um repositório local para usuário a:

feature1
feature2

E para obtê-lo para o servidor central (origem):

git push origin feature1:users/a/feature1

(isso provavelmente pode ser simplificado com alterações de configuração)

De qualquer forma, uma vez feature1 é revista, quem é responsável (no nosso caso, é o desenvolvedor do recurso, você pode ter um único usuário responsável por fusões para mestre), faz o seguinte:

git checkout master
git pull
git merge users/name/feature1
git push

A atração faz um fetch (puxando quaisquer novas alterações mestre e o ramo de recurso) eo mestre atualizações para o repositório central tem. Se o usuário um fez o seu trabalho e monitorados mestre corretamente, não deve haver problemas com a fusão.

Tudo isso significa que, mesmo se um usuário ou equipe remota faz uma alteração em um recurso binário, ele é revisado antes que seja incorporado no branch master. E não há uma definição clara (com base no processo) a respeito de quando algo vai para o branch master.

Você também pode aplicar programaticamente aspectos deste usando ganchos git, mas novamente, eu não tenho trabalhado com estes ainda, então não posso falar sobre eles.

Quando eu estava usando o Subversion, eu religiosamente definir a propriedade svn:needs-lock em todos os binários e até mesmo os arquivos de texto difíceis de edição. I não realmente experimentado quaisquer conflitos.

Agora, em Git, eu não me preocupo com essas coisas. Lembre-se: bloqueios no Subversion não são realmente bloqueios obrigatórios, eles são apenas ferramentas de comunicação. E adivinhem:. Eu não preciso Subversion para se comunicar, posso gerir muito bem com E-mail, telefone e IM

Outra coisa que fiz, é substituir muitos formatos binários com formatos de texto simples. Eu uso reStructuredText ou La? ? ? em vez de Word, CSV, em vez de Excel, ASCII-Art, em vez de Visio, YAML em vez de bancos de dados, SVG, em vez de OO Draw, abc vez de MIDI, e assim por diante.

Vale a pena examinar seu fluxo de trabalho atual para ver se as imagens bloqueio é realmente necessário. É relativamente raro que duas pessoas para editar de forma independente uma imagem, e um pouco de comunicação pode percorrer um longo caminho.

Eu discuti esta questão em grupos de discussão git e concluíram que, neste momento, não existe não acordado método de bloqueio de arquivos centralizada para git.

TortoiseGit suporta fluxo de trabalho git completo para documentos do Office delegando diff para si Office. Ele funciona também delegar para o OpenOffice para os formatos OpenDocument.

Eu não esperaria-arquivo de bloqueio para sempre torná-lo como um recurso no git. Que tipo de arquivos binários que você está interessado principalmente em? Você está realmente interessado em bloqueando os arquivos, ou apenas prevenir conflitos causados ??por não ser capaz de fundi-los.

Eu me lembro de alguém falando (ou até mesmo de execução) apoio para a fusão OpenOffice-documentos no git.

O que cerca de arquivos CAD? Se os arquivos não são bloqueados, para ser guardado somente leitura, bem como, a maioria dos Programas de CAD seria apenas abri-los um pedaços arbitrários mudança, visto como um novo arquivo por qualquer vcs. Então, na minha opinião, o bloqueio é um meio ideal para comunicar a sua intenção de alterar algum arquivo particalur. Como assim, ele evita que algum software para ganhar acesso de gravação em primeiro lugar. Isso permite que as atualizações dos arquivos locais, sem a necessidade de fechar o software ou pelo menos todos os arquivos completamente.

Basta colocar um arquivo de texto em cc com o arquivo que você deseja bloquear e depois ter o gancho atualização rejeitá-la.

Pode ser verdade, que reorganizar um projeto pode ajudar a evitar bloqueios, mas:

  • As equipes também são organizados por outras prioridades (localização, clientes, ...)
  • Ferramentas também são selecionados por outros alvos (compatibilidade, preço, facilidade de uso pela maioria dos empregados)
  • Algumas ferramentas (e arquivos, portanto, não binários) não pode ser evitado, pois simplesmente não há substituto que podem fazer o mesmo trabalho, cabendo a mesma às necessidades companys para o mesmo preço.

Para pedido, que uma companhia inteira pode reorganizar seu fluxo de trabalho e substituir todas as suas ferramentas que produzem binários, apenas para ser capaz de trabalhar com git, por causa da falta de fechaduras, sons bastante ineficiente.

Bloqueios não se encaixam na filosofia git (que nunca foi feito para binários), mas há situações não negligenciável, onde os bloqueios são a forma mais eficiente para resolver tal problema.

Esta não é uma solução, mas sim um comentário sobre o porquê de mecanismos de bloqueio são necessários. Existem algumas ferramentas utilizadas em alguns campos que usam apenas formatos binários que estão fora plana missão crítica e do "uso melhor / diferentes ferramentas" não é apenas uma opção. Não existem ferramentas alternativas viáveis. O que eu estou familiarizado com realmente não seriam candidatos para a fusão, mesmo se você armazenou as mesmas informações em um formato ASCII. Uma objeção que eu ouvi é que você quer ser capaz de trabalhar offline. A ferramenta especial que estou pensando realmente não trabalhar off-line de qualquer maneira por causa da necessidade de licenças de puxar então se eu tiver dados em um laptop não é como eu pode executar a ferramenta, enquanto em um trem de qualquer maneira. Dito isto, o que git prevê se eu tiver uma conexão lenta, posso obter licenças e também puxar para baixo as mudanças, mas tenha a cópia local rápido para olhar para diferentes versões. Isso é uma coisa boa que o DVCS dá-lhe mesmo neste caso.

Um ponto de vista é que git não é simplesmente a ferramenta para uso, mas é bom para todos os arquivos de texto que também são gerenciados com ele e ele é irritante precisar de diferentes ferramentas de controle de versão para arquivos diferentes.

A abordagem de bloqueio-via-mail espécie de-consultivo de realmente fede. Eu vi isso e ter sido cansado de um fluxo interminável de e-mails de "Eu estou editando-lo" "Eu sou feito edição" e mudanças observadas perdidos por causa disso. O caso particular eu estou pensando era um onde uma coleção de arquivos ASCII menores teria sido muito mais agradável, mas que é um aparte.

Eu não estou sugerindo a usar git na minha empresa para o mesmo problema. Usamos EA para todos os nossos projetos e Microsoft Word para documentação, não sabemos de antemão quem pode editar um arquivo em particular assim o bloqueio exclusivo é a nossa única opção.

git vai funcionar muito bem em um ambiente não-equipe, onde cada desenvolvedor é o único responsável por um pedaço de código ou de arquivos, porque nesse caso a comunicação sobre os bloqueios não é necessário.

Se a sua organização requer um ambiente de equipe (geralmente para retirar os desenvolvedores de segurança no trabalho), então use svn, git não é para você. Svn oferece tanto -. Controle de origem e comunicação entre os desenvolvedores sobre bloqueios

Git não está fornecendo qualquer comando para arquivos de bloqueio, mas eu tenho fundo uma maneira de conseguir que a função usando ganchos git. Um servidor auxiliar é necessário para armazenar as informações de bloqueio. Podemos usar um gancho pre-commit para verificar se qualquer um dos arquivos comprometidos está bloqueado. E se alguém bloqueia um arquivo, um programa deve dizer ao servidor auxiliar as informações do armário e o arquivo bloqueado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top