| ローカルリポジトリで作業中、ファイルに加えた変更を破棄するために hg revert したのですが、
| 状態が modified から変わらず、hg st で M と表示されます。
|
| 当方環境
| ・OS : Windows Vista 32bit SP1
| ・Mercurial : TortoiseHg 2.1.1
| ・セントラルリポジトリに bitbucket を使用
| ・5名でセントラルリポジトリを介して作業
| ・Windows, Mac 混在環境
| ・当方リポジトリのパスには全角文字は含まれていません。
OSが同じvistal 32bitですので試してみました。
こちらではhg statusはcleanとなりました。
C:\Users\koie>hg init repo
C:\Users\koie>cd repo
C:\Users\koie\repo>echo aaa>file
C:\Users\koie\repo>hg add file
C:\Users\koie\repo>hg commit -m xxx file
C:\Users\koie\repo>echo bbb>>file
C:\Users\koie\repo>hg stat
M file
C:\Users\koie\repo>hg revert file
C:\Users\koie\repo>hg stat
? file.orig
C:\Users\koie\repo>hg version
Mercurial Distributed SCM (version 1.9+10-e9264b45237d)
(see http://mercurial.selenic.com for more information)
Copyright (C) 2005-2011 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
C:\Users\koie\repo>
--
鯉江英隆 <hi...@koie.org>
--
from Mercurial 日本語コミュニティ <mercur...@googlegroups.com>
※ ヘルプ表示は http://groups.google.com/group/mercurial-ja?hl=ja
Shinobu Koyama wrote:
> 大丈夫とのことですのでローカルリポジトリを投稿します。
フジワラ wrote:
> 現象について補足します。
>
> - ローカルリポジトリ A で、あるファイルが modified 状態
> - hg diff 出力は:
> - ファイルモードの改変は無し
> - 1行の差異が出力されるが、見た目は同一
> - 一番怪しいのは改行コードだが "hg revert" や "rm + hg update" しても改善なし
> - "hg update null + hg update tip" しても、modified 状態は変わらず
> - 別なリポジトリ B を clone すると、そちらは clean
> - A と B のファイルの差分を取ると、先だっての hg diff よりも多い差分が出力
添付されたファイルを見てみました。
差異はフジワラさんの仰られている通り、改行コードのようです。
(color エクステンションを使うと行末の空白と改行コードを強調表示してくれますよ!)
-<meta http-equiv="content-language" content="ja" /> ^M
+<meta http-equiv="content-language" content="ja" />
しかし、うちの環境では(Windows XP, Linux とも) hg revert や hg update null
で問題が再現しませんでした。
少し気になるのが TortoiseHg のファイル監視とアンチウィルスソフトのファイルロック問題
です。(#889)
恐らく関係無いとは思うのですが、問題が起きたときに TortoiseHg を起動していましたか?
https://bitbucket.org/tortoisehg/thg/issue/889/
あるいは、 Vista の UAC データリダイレクト ... は関係ないですよね、この場合。たぶん。
それでは。
--
SCMBC in 名古屋とか無いですかー?
フジワラ wrote:
> > Shinobu Koyama wrote:
> > > 大丈夫とのことですのでローカルリポジトリを投稿します。
> > フジワラ wrote:
> > > 現象について補足します。
> >
> > > - ローカルリポジトリ A で、あるファイルが modified 状態
> > > - hg diff 出力は:
> > > - ファイルモードの改変は無し
> > > - 1行の差異が出力されるが、見た目は同一
> > > - 一番怪しいのは改行コードだが "hg revert" や "rm + hg update" しても改善なし
> > > - "hg update null + hg update tip" しても、modified 状態は変わらず
> > > - 別なリポジトリ B を clone すると、そちらは clean
> > > - A と B のファイルの差分を取ると、先だっての hg diff よりも多い差分が出力
> >
> > 添付されたファイルを見てみました。
> > 差異はフジワラさんの仰られている通り、改行コードのようです。
> > (color エクステンションを使うと行末の空白と改行コードを強調表示してくれますよ!)
> >
> > -<meta http-equiv="content-language" content="ja" /> ^M
> > +<meta http-equiv="content-language" content="ja" />
>
> 検証、ありがとうございます > 西原さん
>
> やはり改行コードでしたか。
>
> ちなみに color ext での強調表示って、DOS 窓でも有効なんでしょうか?
あ、強調表示は機能しますが、改行コード(^M)は見えませんでした。すいません。
^M を表示しているのはページャー(less)でした。 color.py の行末空白強調の
影響で ^M^J が 色指定^M色指定^J へ分割されるおかげで見えるみたいです。
現状のリポジトリを見る限り team.html がLFベース+1行だけCRLFという状態なので、
win32textでは扱い切れない状態になってます。まずはそこを直さないと。
それと1行だけCRLFが混在するようなテキストを作ってしまった原因ですが、
エディタ次第でそういうことが起きえます。手元で1行だけ直してセーブしたが、
その行はCRLFだけど、手をつけていないほかの行は元のまま(LF)なんてことが
起きたりします。自分のしててる例だと Visutal Studio でReSharperに using 整理を
自動でやらせた場合など。
改行コードが善行揃っているのに現在の不本意な modified が出るというのであれば
hg up -C すればいいかと。要は、hg revert は .hg/dirstate を作りなおす。
一度 hg st して .hg/dirstateが作られたあとでencode/decode 設定を変えると
変えるとそういう感じの症状になりがちです。今回のCRLF混在もその手の操作
によるものではないかなと思いますが。
こういう煩わしが付いて回るために win32textは廃止予定なわけですから、
win32text を使ってる人/リポジトリは早めに eol extension に移行するのが吉だと思います。
--
Shun-ichi GOTO
2011年7月31日17:23 Shinobu Koyama <y015...@gmail.com>:
> 念のため hg showconfig の出力も投稿させて頂きます。
> フジワラさんに見て頂いたままの設定になっています。
1点、設定上の問題を見つけました。
decode.**=cleverencode:
encode.**=cleverencode:
"decode" の設定に「clever"en"code」が設定されているのは
明らかに設定ミスですね。
# っていうか、当日気付かずごめんなさい .... orz
ファイルの修正日付/サイズ等が更新されると、内容チェック(hash 値計算)が
走る筈なので、decode → encode の過程で内容の不整合が発生しますから、
hg diff/status が想定外になる件はこれで説明できると思います。
ただ、"hg update null && hg update tip" で clean 化しない件に関しては、
いまいち発生過程がひらめきません ....
--
----------------------------------------------------------------------
FUJIWARA Katsunori(flying...@gmail.com)
2011年7月31日17:39 Shun-ichi Goto <shunic...@gmail.com>:
> 改行コードが善行揃っているのに現在の不本意な modified が出るというのであれば
> hg up -C すればいいかと。要は、hg revert は .hg/dirstate を作りなおす。
> 一度 hg st して .hg/dirstateが作られたあとでencode/decode 設定を変えると
> 変えるとそういう感じの症状になりがちです。今回のCRLF混在もその手の操作
> によるものではないかなと思いますが。
"hg update null" で作業領域を空(= 初期状態)にしてから、
"hg update tip" で最新状態にしてみたのですが、
現象は改善されなかったのですよ。
dirstate が更新されて、ファイルのタイムスタンプ/サイズ情報と同期されるので、
win32text:encode/decode 設定の問題は残るものの、hg の内部処理的には
status/diff 共に clean 扱いで通る(= ファイル内容のチェックまでは実施されない)
筈だと思うのですが .....
# team.html の古いファイルが残ってしまっていたのかな?
--
----------------------------------------------------------------------
FUJIWARA Katsunori(flying...@gmail.com)
Katsunori FUJIWARA wrote:
> > 改行コードが善行揃っているのに現在の不本意な modified が出るというのであれば
> > hg up -C すればいいかと。要は、hg revert は .hg/dirstate を作りなおす。
> > 一度 hg st して .hg/dirstateが作られたあとでencode/decode 設定を変えると
> > 変えるとそういう感じの症状になりがちです。今回のCRLF混在もその手の操作
> > によるものではないかなと思いますが。
>
> "hg update null" で作業領域を空(= 初期状態)にしてから、
> "hg update tip" で最新状態にしてみたのですが、
> 現象は改善されなかったのですよ。
>
> dirstate が更新されて、ファイルのタイムスタンプ/サイズ情報と同期されるので、
> win32text:encode/decode 設定の問題は残るものの、hg の内部処理的には
> status/diff 共に clean 扱いで通る(= ファイル内容のチェックまでは実施されない)
> 筈だと思うのですが .....
hg update tip のタイミングでおかしくなりますね。
Windows で hg up null; hg up tip した直後:
Z:\inbox\scmbc>python Z:\work\hghacks\mercurial\hg stat
win32text is deprecated: http://mercurial.selenic.com/wiki/Win32TextExtension
M team.html
? m.team.html
? team.html.org
? team.html.orig
その後 win32text を無効化して hg stat:
Z:\inbox\scmbc>python Z:\work\hghacks\mercurial\hg stat
? m.team.html
? team.html.org
? team.html.orig
Mercurial.ini はこういう状態です ([encode] だけ設定してみました):
[extensions]
win32text =
[encode]
** = cleverencode:
[decode]
;** = cleverdecode:
あぁ、なんとなく昔同じようなことで悩んだような。
hg debugstate でみると、unset になってますね。
だから毎回内容比較してるのだと思います。
unsetになる理由の詳細は確かめてませんが、EOL変換がうまくない場合に
セットされないんだと思います。
hg up 0 してから hg up -C tip すると、
WARNING: team.html already has CRLF line endings
が出て、以降の debugstate, st, 再debugstate は以下の状態
[c:\temp\scmbc]hg debugstate
win32text is deprecated: http://mercurial.selenic.com/wiki/Win32TextExtension
n 0 -1 unset index.html
n 0 -1 unset local.html
n 0 -1 unset team.html
[c:\temp\scmbc]hg st
win32text is deprecated: http://mercurial.selenic.com/wiki/Win32TextExtension
M team.html
? m.team.html
? team.html.org
? team.html.orig
[c:\temp\scmbc]hg debugstate
win32text is deprecated: http://mercurial.selenic.com/wiki/Win32TextExtension
n 666 396 2011-07-31 18:26:32 index.html
n 666 839 2011-07-31 18:26:32 local.html
n 0 -1 unset team.html
なんにせよ、win32textでLFに正規化するつもりならば、team.html の r35 に混入した
CRLFな行(3行目のcontent-language行)を正しいものに解消しないと。
encode/decode設定を正しく直した後に、単純にコミットすればいいと思います。
ただし、tipはそれで良くなりますが、あとでr35に戻ったときに似たような症状が
出ます。encode/decode設定はrevに連動しないためです。そこらへんがeolが導入
された動機でもあります。
自分しか使ってないならば mq で r35 自体を修正してしまうほうがいいかも。
--
Shun-ichi GOTO
mqで、といったのはr36の内容を書き換えて、半端なrevを残さないようにして
しまうということです。今はすでに r37 かと思いますので以下のように:
hg qimp -r 36:37
hg qpop
(edit team.html to fix CRLF)
hg qrefresh
hg qrm 37.diff
hg qfinish -a
あるいは
hg qimp -r 36:37
hg qpop
hg qfold 37.diff
hg qrefresh --edit # (edit commit log)
hg qfinish -a
とかでしょうか。出来上がったものは tip = r36 になります。
あと、上記操作は encode/decode設定を外して行ったほうが間違いが少ないかも。
mqによる「いじり」は超絶役に立ちますので覚えると幸せになれると思います。
リポジトリをいじることになるため過信するとハマるので練習が必要ですが。
> このような状態になってしまった原因は 「1行だけ CRLF な行を混入させて
> しまった」で確定でしょうか。
> となると使い方が悪かったのですね…(Mercurial の使い方以前の問題)
確定かどうかはわかりませんが、自分がやったこと、使ったツールを用いて再現してみる
というのもいいかもしれません。
--
Shun-ichi GOTO
小山です。おはようございます。
strip + backout ではなく strip ( + マージ) だったかもしれません。
帰宅したら整理して投稿します!
2011/08/01 0:15 "フジワラ" <flying...@gmail.com>:
小山です。
状況としては bitbucket の共有リポジト}> まるやまです。