我做了一個hg mv -A oldFile newFile
並意外地弄錯了新文件。撤銷mercurial中的移動/重命名操作?
我做了一個hg revert newFile
但現在顯示爲丟失(然後在移動命令後移除)的文件現在不再顯示出來。
我該如何撤銷並回到我所處的狀態,以便新文件顯示爲未知並且舊文件顯示爲缺失?
我做了一個hg mv -A oldFile newFile
並意外地弄錯了新文件。撤銷mercurial中的移動/重命名操作?
我做了一個hg revert newFile
但現在顯示爲丟失(然後在移動命令後移除)的文件現在不再顯示出來。
我該如何撤銷並回到我所處的狀態,以便新文件顯示爲未知並且舊文件顯示爲缺失?
$ hg st
$ mv a b
$ hg st
! a
? b
$ hg mv -A a b
$ hg st
A b
R a
$ hg revert b
$ hg st
? b
$ ls
a b
所以hg revert b
恢復舊文件a
。現在你所要做的就是hg mv a correct-name
。
這是一個用bash寫的「unmove」腳本。頂部有一些幫助文字。最重要的一點是,該腳本有一個選項,強制任何文件刪除交互。
#!/bin/bash
# Syntax: $0 [OPTION] DEST
#
# This script is mainly intended to undo the effects of: hg move SOURCE DEST
#
# It first determines which files have been added globally (as if by
# hg add), then it runs:
# hg -v revert DEST
# Finally, it removes all the files that had been added,
# and then reverts them as well if possible.
#
# OPTIONS:
# -i :: remove files using rm -i
if [ "$1" = -i ] ; then
INTERACT=$1
shift
fi
TODO=()
while read -r f ; do
TODO+=("$f")
done < <(hg st -an "[email protected]")
function go {
hg -v revert "[email protected]"
for f in "${TODO[@]}" ; do
rm $INTERACT "$f"
hg -q files "$f" > /dev/null && hg revert "$f"
done
}
go
謝謝!並不認爲它會恢復刪除舊文件。 –
由於最後一個'ls'顯示,名爲「b」的文件仍然存在,所以原來的問題還沒有完全回答。使用這裏說明的技術,文件「b」將不得不手動刪除。當然,在給定的情況下,如果原始的'mv a b'已經破壞了b,那麼b就消失了。更有理由使用'hg mv'代替。 – peak