5

В SVN svn update покажет список полных путей с префиксом статуса:

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

Мне нужно получить этот список обновлений, чтобы выполнить некоторую постобработку. После того, как я перенес SVN-репозиторий в Git, я не могу найти способ получить список обновлений:

$ 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 +-

Я могу перевести список статуса Git pull в формат 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

Однако некоторые записи, имеющие длинные имена путей, сокращаются, например, uni/package/cooldeb/update-and-deb-redist сокращается до ...update-and-deb-redist .

Я считаю, что могу работать с Git напрямую, может быть, я могу настроить вывод git pull в специальном формате.

Любая идея?

РЕДАКТИРОВАТЬ

Я нашел решение для этого:

Сначала сохраните последний и текущий коммит в переменную PREV и NEXT:

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

А затем сравните два коммита в специальном формате:

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

Это даст вывод:

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
...

Что точно так же, как у Subversion.

Затем это также легко сделать в режиме предварительного просмотра:

$ 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

1 ответ1

3

Первый вариант 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.

Так что используйте git pull --no-commit .

РЕДАКТИРОВАТЬ: Ой! Это не работает. Как указал 谢 继 雷 (автор вопроса), git pull --no-commit все равно будет коммитить. Я использую git version 1.7.0.4 .

Если вы не знаете, какие изменения были внесены, то есть способ вернуться назад:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .