Git mark file as binary options


Eu tenho lutado com este problema por um tempo, e acabei de descobrir (para mim) uma solução perfeita: git difftool leva os mesmos argumentos que git diff, mas executa um programa diff de sua escolha em vez do built-in GNU diff. Então escolha um diff multibyte-aware (no meu caso, vim no modo diff) e apenas use git difftool em vez de git diff. Encontre o difftool muito tempo para digitar Não há problema: Por padrão, parece que o git não funcionará bem com o UTF-16 para um arquivo assim que você tem que se certificar de que nenhum processamento CRLF é feito nele, mas você quer diff e merge para funcionar como Um arquivo de texto normal (isso está ignorando se o seu terminal / editor pode ou não lidar com UTF-16). Mas olhando para a página de manual. gitattributes. Aqui está o atributo personalizado que é binário: Então, parece-me que você poderia definir um atributo personalizado no seu nível superior. gitattributes para utf16 (note que eu adiciono mesclar aqui para ter certeza que é tratado como texto): De lá você iria Ser capaz de especificar em qualquer arquivo. gitattributes algo como: Note também que você ainda deve ser capaz de dif um arquivo, mesmo se git pensa seu binário com: Esta resposta basicamente diz que GNU diff wth UTF-16 ou mesmo UTF-8 doesnt Funcionam muito bem. Se você quiser que o git use uma ferramenta diferente para ver diferenças (via --ext-diff), essa resposta sugere Guiffy. Mas o que você provavelmente precisa é apenas para dif um arquivo UTF-16 que contém apenas caracteres ASCII. Uma maneira de conseguir que funcione é usar --ext-diff eo seguinte script shell: Note que a conversão para UTF-8 pode funcionar para a fusão também, você só tem que certificar-se de seu feito em ambas as direções. Quanto à saída para o terminal ao olhar para um diff de um arquivo UTF-16: Tentando diff como que resulta em binário lixo vomitado para a tela. Se git estiver usando GNU diff, parece que GNU diff não é unicode-aware. GNU dif doesnt realmente se preocupam com unicode, então quando você usa diff --text apenas diffs e saídas do texto. O problema é que o terminal que você está usando não consegue lidar com o UTF-16 thats emitido (combinado com as marcas diff que são caracteres ASCII). A solução é filtrar através do cmd. exe / c type 1. O cmds type builtin fará a conversão, e assim você pode usar isso com a habilidade textconv do git diff para habilitar o texto difere de arquivos UTF-16 (deve funcionar com UTF-8 Também, embora não testado). Citando a página de manual gitattributes: Executando diffs de texto de arquivos binários Às vezes é desejável ver o diff de uma versão convertida de alguns arquivos binários. Por exemplo, um documento de processador de texto pode ser convertido em uma representação de texto ASCII e o diff do texto mostrado. Mesmo que essa conversão perca alguma informação, o diff resultante é útil para visualização humana (mas não pode ser aplicado diretamente). A opção de configuração textconv é usada para definir um programa para executar tal conversão. O programa deve ter um único argumento, o nome de um arquivo para converter e produzir o texto resultante em stdout. Por exemplo, para mostrar o diff das informações exif de um arquivo em vez das informações binárias (supondo que você tenha a ferramenta exif instalada), adicione a seguinte seção ao arquivo GITDIR / config (ou arquivo HOME /.gitconfig): Uma solução Para mingw32. Os fãs do cygwin podem ter que alterar a abordagem. O problema é com passar o nome do arquivo para converter cmd. exe - ele estará usando barras para a frente, e cmd assume backslash diretório separadores. Crie o script de argumento único que fará a conversão para stdout. C: pathtosomescript. sh: Configurar git para poder usar o arquivo de script. Dentro do seu git config (/.gitconfig ou. git / config ou ver man git-config), coloque o seguinte: Apontar arquivos para aplicar este workarond usando arquivos. gitattributes (ver man gitattributes (5)): use git diff Em seus arquivos. Eu vejo aqui o patch que introduz a opção de paciência para a estratégia de fusão recursiva, base em Git1.7.2.2, mas eu não vejo isso em qualquer uma das notas de lançamento subseqüentes. No entanto, o algoritmo de paciência dif foi apresentado desde 2009, e é detalhado aqui. O comando de intercalação deve compreender esta opção. Mas essa função abaixo parece nunca ser chamado (não em qualquer lugar em merge-recursive. c ou em qualquer outro arquivo. c): A mensagem de erro de opção Desconhecido é apenas impressa pela função handleoptions no git. c. E XDFPATIENCEDIFF não mostra em nenhum outro lugar nas fontes git (1.7.4). Então sim, eu não sei como isso poderia ser implementado para a merge. git-bisect (1) Página Manual Este comando usa um algoritmo de busca binária para descobrir qual commit no histórico de seu projeto introduziu um bug. Você usá-lo primeiro dizendo-lhe um commit ruim que é conhecido por conter o bug, e um bom commit que é conhecido por ser antes do bug foi introduzido. Então git bisect escolhe um commit entre esses dois pontos finais e pergunta se o commit selecionado é bom ou ruim. Ele continua estreitando o intervalo até encontrar o commit exato que introduziu a mudança. De fato, git bisect pode ser usado para encontrar o commit que mudou qualquer propriedade de seu projeto, O commit que corrigiu um bug, ou o commit que causou um desempenho benchmark8217s para melhorar. Para apoiar este uso mais geral, os termos antigo e novo podem ser usados ​​em lugar de bons e maus, ou você pode escolher seus próprios termos. Consulte a seção Termos alternativos abaixo para obter mais informações. Como um exemplo, suponha que você esteja tentando encontrar o commit que quebrou um recurso que era conhecido por trabalhar na versão v2.6.13-rc2 do seu projeto. Você inicia uma sessão bisect como segue: Depois de ter especificado pelo menos um mau e um bom commit, git bisect seleciona um commit no meio desse intervalo de histórico, verifica-lo e saídas algo semelhante ao seguinte: Você deve agora Compilar a versão verificada e testá-la. Se essa versão funcionar corretamente, digite Note que o script (myscript no exemplo acima) deve sair com o código 0 se o código fonte atual for bom / antigo e sair com um código entre 1 e 127 (inclusive), exceto 125, if O código fonte atual é ruim / novo. Qualquer outro código de saída abortará o processo bisect. Note-se que um programa que termina via exit (-1) deixa 255, (veja a página de manual de saída (3)), como o valor é cortado com amp 0377. O código de saída especial 125 deve ser usado quando o código fonte atual não puder ser testado. Se o script sai com este código, a revisão atual será ignorada (ver git bisect skip acima). 125 foi escolhido como o valor sensível mais alto a ser usado para este propósito, porque 126 e 127 são usados ​​pelos shells POSIX para sinalizar status de erro específico (127 é para o comando não encontrado, 126 é para o comando encontrado, mas não executável8212 esses detalhes não importam, Eles são erros normais no script, tanto quanto bisect run está em causa). Muitas vezes você pode achar que durante uma sessão bisect você quer ter modificações temporárias (por exemplo, s / define DEBUG 0 / define DEBUG 1 / em um arquivo de cabeçalho, ou revisão que não tem essa confirmação precisa deste patch aplicado para resolver outro problema este Bissecção não está interessado) aplicado à revisão que está sendo testada. Para lidar com essa situação, depois que o git beto interno encontrar a próxima revisão para testar, o script pode aplicar o patch antes de compilar, executar o teste real e depois decidir se a revisão (possivelmente com o patch necessário) passou no teste e Em seguida, rebobinar a árvore para o estado intocada. Finalmente, o script deve sair com o status do teste real para permitir que o git bissect executar comando loop determinar o resultado final da sessão bissect. Não descarte a nova árvore de trabalho em cada iteração do processo de bisecção. Em vez disso, basta atualizar uma referência especial chamada BISECTHEAD para torná-lo apontar para o commit que deve ser testado. Esta opção pode ser útil quando o teste que você executaria em cada etapa não requer uma árvore de check-out. Se o repositório estiver nu, --no checkout é assumido.

Comments