在 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 拉取状态列表转换为 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
第一个选项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