Comparando uma pasta com uma subpasta do repositório git


6

Eu tenho uma pasta now uma vez exportado de um repositório git e o próprio repositório git:

/
/now/
/repository.git/

Eu gostaria de comparar os arquivos em now para o estado atual do repositório. Enquanto isso é feito facilmente com --git-dir=/repository.git e --work-tree=/now,

git --git-dir=/repository.git --work-tree=/now status

não é tão óbvio para mim, quando now era um subpasta das coisas no repositório git.

Existe uma maneira - além de verificar o repositório novamente e diff as coisas - ter git de alguma forma comparar a pasta e a subpasta correspondente no repositório? (Eu sei, esse git não é centrado em torno da idéia de mudanças em arquivos únicos, então eu realmente espero que um bem informado não .)

Respostas:


2

Você pode preencher um arquivo de índice temporário apenas com o conteúdo do subdiretório do repositório e, em seguida, diferenciar os arquivos existentes com ele.

diff-sub() { : usage: diff-sub repo treeish-in-repo external-dir
  (
    GIT_DIR="$1" GIT_WORK_TREE="$3"
    GIT_INDEX_FILE=/tmp/.git-index--now-sub.tmp
    if test -e "$GIT_INDEX_FILE"; then
      echo "already exists: $GIT_INDEX_FILE"
      exit 1
    fi
    export GIT_DIR GIT_INDEX_FILE GIT_WORK_TREE
    git read-tree "$2" &&
    git diff
    ec=$?
    rm -f "$GIT_INDEX_FILE"
    exit "$ec"
  )
}
: diff sub from master in /repository.git against /now
diff-sub /repository.git master:sub /now

Nota: Se você executar outros comandos do Git que sejam comparados com a árvore normal e completa (por exemplo, git status ou git diff --cached ao invés de git diff ), então você verá resultados de aparência estranha, pois tanto o índice quanto a árvore de trabalho contêm apenas uma parte da árvore normal e cheia.


Hm, ideia interessante. Como você obtém o arquivo de índice temporário? Eu olhei para coisas como git-read-tree e o formato do arquivo de índice em si, mas ainda não descobri a edição do arquivo binário.
Boldewyn

Você só deve usar os comandos do Git para ler / atualizar um arquivo de índice do Git (ou seja, você não precisa saber sobre o formato binário no disco, a menos que esteja escrevendo seu próprio comando de “encanamento”). Quando a variável de ambiente GIT_INDEX_FILE estiver definida, todos os comandos do Git usarão o arquivo especificado em vez do arquivo de índice normal (normalmente .git/index ). No caso do código shell na resposta, o git read-tree comando irá criar o arquivo de índice alternativo eo git diff O comando irá lê-lo e comparar o conteúdo efetivo à árvore de trabalho especificada.
Chris Johnsen

2

Você pode recriar a estrutura de diretórios que leva à subpasta e aproveitar as vantagens --relative opção para comandos como diff e log (mas não status ). Por exemplo, se você tiver um checkout de sub/dir:

mkdir -p sub
mv now sub/dir
git --git-dir=/repository.git diff --relative=sub/dir

+1, obrigado. Eu suponho que não é possível sem o mv?
Boldewyn

@Boldewyn: não que eu saiba, mas eu sou um novato git. Se mover é um problema, talvez você possa usar cp -al (copiar diretórios de arquivos de link difícil) ou bindfs .
Gilles

Legal, obrigado por me apontar para bindfs (eu realmente começo a amar o poder do FUSE ...).
Boldewyn
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.