Como mostrar o que será atualizado próximo pull?

5

No SVN, fazer svn update mostrará uma lista de caminhos completos com um prefixo de status:

$ svn update
M foo/bar
U another/bar
Revision 123

Eu preciso de obter esta lista de atualização para fazer algum trabalho pós-processo. Depois de ter transferido o repositório SVN para o Git, não consigo encontrar uma maneira de obter a lista de atualização:

$ git pull
Updating 9607ca4..61584c3
Fast-forward
 .gitignore                                         |    1 +
 uni/.gitignore                                     |    1 +
 uni/package/cooldeb/.gitignore                     |    1 +
 uni/package/cooldeb/Makefile.am                    |    2 +-
 uni/package/cooldeb/VERSION.av                     |   10 +-
 uni/package/cooldeb/cideb                          |   10 +-
 uni/package/cooldeb/cooldeb.sh                     |    2 +-
 uni/package/cooldeb/newdeb                         |   53 +++-
 ...update-and-deb-redist => update-and-deb-redist} |    5 +-
 uni/utils/2tree/{list2tree => 2tree}               |   12 +-
 uni/utils/2tree/ChangeLog                          |    4 +-
 uni/utils/2tree/Makefile.am                        |    2 +-

Eu posso traduzir a lista de status do Git Pull para o formato do SVN:

M .gitignore
M uni/.gitignore
M uni/package/cooldeb/.gitignore
M uni/package/cooldeb/Makefile.am
M uni/package/cooldeb/VERSION.av
M uni/package/cooldeb/cideb
M uni/package/cooldeb/cooldeb.sh
M uni/package/cooldeb/newdeb
M ...update-and-deb-redist => update-and-deb-redist}
M uni/utils/2tree/{list2tree => 2tree}
M uni/utils/2tree/ChangeLog
M uni/utils/2tree/Makefile.am

No entanto, algumas entradas com nomes de caminho longos são abreviadas, como uni/package/cooldeb/update-and-deb-redist é abreviado como ...update-and-deb-redist .

Eu acho que posso fazer com o Git diretamente, talvez eu possa configurar a saída de git pull em formato especial.

Alguma ideia?

EDITAR

Eu descobri uma resolução para isso:

Primeiro, salve o último e o atual commit na variável PREV e NEXT :

$ PREV='git show --format=format:%H --summary | head -1'
$ git pull
$ NEXT='git show --format=format:%H --summary | head -1'

E, em seguida, compare os dois commits usando um formato especial:

$ git diff --name-status $PREV $NEXT

Isso fornecerá a saída:

A       .gitignore
M       uni/.gitignore
A       uni/package/cooldeb/.gitignore
M       uni/package/cooldeb/Makefile.am
M       uni/package/cooldeb/VERSION.av
M       uni/package/cooldeb/cideb
M       uni/package/cooldeb/cooldeb.sh
...

Qual é exatamente o mesmo que o do Subversion.

Depois, também é fácil fazer isso no modo de visualização:

$ PREV='git show --format=format:%H --summary | head -1'
$ git stash
$ git pull
$ NEXT='git show --format=format:%H --summary | head -1'
$ git diff --name-status $PREV $NEXT
$ git reset --hard $PREV
$ git stash pop
    
por Xiè Jìléi 06.01.2011 / 00:36

1 resposta

3

A primeira opção de man git-pull é:

   --no-commit

       With --no-commit perform the merge but pretend the merge failed and
       do not autocommit, to give the user a chance to inspect and further
       tweak the merge result before committing.

Portanto, use git pull --no-commit .

EDIT: Ops! Isso não funciona. Como 谢 继 雷 (autor da pergunta) apontou git pull --no-commit ainda vai confirmar. Estou usando git version 1.7.0.4 .

Se você não sabe quais foram as mudanças, então há uma maneira de voltar:

git branch bad-branch-1
git log                          # Find the point you want to restore to,
                                 # for example: 35da5f07ca2c5

git reset --hard 35da5f07ca2c5   # Rolls back history and files
    
por 06.01.2011 / 00:50

Tags