2017-06-06 25 views
0

私はMercurialに、シンボリックリンクと思われるすべての追跡ファイルをリポジトリにリストさせたいと思っています。 hg files "set:symlink()"で作業コピーのシンボリックリンクであるトラッキングされたシンボリックリンクのリストを取得できますが、それは作業コピーのシンボリックリンクではないトラッキングされたシンボリックリンクを取得しません。Mercurialに、シンボリックリンクとして追跡されたすべての追跡ファイルを一覧表示する方法を教えてください。

代わりに、私は、マニフェストで追跡されたファイルのプロパティを見て、シンボリックリンクビットが設定されているかどうかを教えてくれます。私はhg manifest -vを使用しようとしましたが、ドキュメントには"print file permissions, symlink and executable bits"と書かれています。私はそれを試みましたが、シンボリックリンクは、実行可能ビットが設定されている非リンクファイルと区別できません。私は主要なマーカー(hg manifest -v | grep '755 *')を使用しようとすると、私が欲しいのファイルがリストされている

755 * path/to/file 

、私はまた、偽陽性の多くを得る:私はの多くを得ます。

背景:シンボリックリンクの追加とコミットは私たちにとってはうまくいくようですが、他の誰かがそれらのチェンジセットをプルすると、Mercurialはシンボリックリンクの作成を拒否しています。私はMercurialがなぜ拒否しているのかを理解しています。私たちはan undocumented ruleに挑戦します。だから、シンボリックリンクが想定されているファイルで終わります。ファイルの内容は、シンボリックリンクが指しているはずのパスです。私がMercurialにどのファイルがシンボリックリンクであると言われたら、ファイルを適切なリンクで簡単に置き換えることができます。

ありがとうございました!

編集:私のリポジトリに、シンボリックリンクが原因hg manifest -vがリンクとしてコミットされたファイルを示していなかった理由であるクライアントのバグに適切にコミットされていませんでした。

答えて

0

symlinkから「通常のファイル」に変更されたファイルを評価するには、bashをスローして、変更されたバージョンと変更されていないバージョンのファイルセットの出力を比較します。たぶん

diff <(hg files "set:symlink()" -r.) <(hg files "set:symlink()") 

のようなもの例:EEG-リンクが追加されました、foo22リンクを編集し、通常のファイルとのfooに変更(およびFOO-リンクがそれを指して保管)リポジトリに

$ hg diff 
diff --git a/eeg-link b/eeg-link 
new file mode 120000 
--- /dev/null 
+++ b/eeg-link 
@@ -0,0 +1,1 @@ 
+eeg 
\ No newline at end of file 
diff --git a/foo b/foo 
--- a/foo 
+++ b/foo 
@@ -1,2 +1,3 @@ 
foo is boo! 
And this change, too! 
+And even this. 
diff --git a/foo22-link b/foo22-link 
old mode 120000 
new mode 100644 
--- a/foo22-link 
+++ b/foo22-link 
@@ -1,1 +1,1 @@ 
-foo22 
\ No newline at end of file 
+This is no symlink anymore 

たちは

$ diff <(hg files "set:symlink()" -r.) <(hg files "set:symlink()") 
0a1 
> eeg-link 
2d2 
< foo22-link 

新しく追加されたシンボリックリンクを示すのきれいな出力が得られ(EEG -link)と削除されたシンボリックリンク(foo22-link)。

+0

ありがとうございました!あなたのソリューションは、ユーザーがファイルを意図的に変更していて、その変更を見たいと思っていたリポジトリに適しています。私は今朝、自分の問題は実際にはファイルがGUIツールによって不適切に追加/コミットされていることを発見しました。つまり、 "set:symlink"は決してそれらを見ませんでした。 –

1

私はいくつかのことを学んだ、と私は右の質問をされなかったが、のは、最初の方法のうち、クローズ十分な答えを取得してみましょう:

hg manifest -v | grep ' @ '

警告: Iマニフェストでパーミッション番号とパスの間に複数のシンボルを置くことが可能であると推測します。' @ ' grep式は完全には機能しません。私たちのリポジトリには、名前に@というファイルがたくさんあるので、私は@の周りにスペースが必要でした。

物語の残り:いくつかの実験の後、私は特定の水銀GUI(SourceTreeは)longstanding issue with the Mac versionであることが判明し、正しく新しいシンボリックリンクを、コミットされなかったことを判断することができました。新しいリポジトリ(hg init)を作成し、コマンドラインhgで1つのターゲットファイルと1つのシンボリックリンク(Link\link.txt)を追加/コミットしました。次に、2番目のシンボリックリンク(Link\STlink.txt)をSourceTreeに追加/コミットしました。 hg manifest -vはリンクが異なるクライアントで同じように扱われていなかったことを示しています

755 * Link/STlink.txt 
644 @ Link/link.txt 
644 Target/target.txt 

私もSourceTreeと、そのレポのクローンを作成する場合は、Link/link.txtシンボリックリンクが忠実に再現されていますが、Link\STlink.txtリンクはありません。だから私の本当の修正は、すべてのファイルをリンクで置き換えてコマンドラインから再コミットし、SourceTreeを使用して将来新しいシンボリックリンクを再度コミットしないようにすることです。

関連する問題