Subversionで管理されているファイル名の@文字をエスケープする方法


191

多くのSubversion操作では、ファイルまたはURL引数の最後に「@」記号を追加すると、そのファイルの特定のリビジョンをターゲットにすることができます。たとえば、「svn info test.txt@1234」は、リビジョン1234に存在していたtest.txtに関する情報を提供します。

ただし、ファイルの名前に@が含まれていると、Subversionによってリビジョン指定子として誤って解釈されます。

svn info 'test @ .txt' svn:リビジョン '.txt'を解析する構文エラー

私は二重引用符と一重引用符を試し、「/」、「\」、「@」でエスケープしました。@記号をファイル名の一部として扱うようにSubversionに指示するにはどうすればよいですか?


3
なぜ地球上に@を含むファイル名があるのですか?問題が発生した場合、質問があれば... :-)
JesperE 2009

とても良い質問です!:)この文字がファイルの命名規則の基本的なコンポーネントであるプロジェクトを引き継ぎますが、残念ながらこれは近い将来変更できません。
ウェストン2009

57
Appleは、iOS 4以降のすべてのiOS開発者向けにこの規則を作成しました。高解像度で表示する場合、すべてのアセットに@ 2xという名前を付ける必要があります...
Dimitris

2
ゲットーの古いスタイルのMatlab OOの標準
Chinasaur

アット含む-アプリケーション与えられ、不当ではない-あなたはサンダーバードのEnigmailのからあなたの秘密鍵または失効キーを保存する場合にも、それはファイル名を作成します
ピーター・フリン

回答:


283

SVNブック(強調追加):

知覚的な読者は、おそらくこの時点で、ペグリビジョン構文が、実際にアットマークが含まれている作業用コピーパスまたはURLに問題を引き起こすかどうか疑問に思っています。結局のところ、svnはどのようにしnews@11てツリー内のディレクトリの名前なのか、あるいは単に「リビジョン11のニュース」の構文なのかを知るのでしょうか。ありがたいことに、svnは常に後者を想定しますが、簡単な回避策があります。ように、パスの末尾にアットマークを追加するだけnews@11@です。svnは引数の最後のアットマークのみを考慮し、アットマークの後のリテラルペグリビジョン指定子を省略することは違法とは見なされません。この回避策は、アットマークで終わるパスにも適用されます。filename@@filename @という名前のファイルについて話します。


4
「svn diff」を使用するには、リビジョンパラメータを追加する必要があることに注意してください。「svn up @ file @」は機能しますが、「svn diff @ file @」は機能しません。「svn diff -r HEAD @ file @」を使用する必要があります
analytik

SVNブックに関する注意:ファイルは、Windowsでも拡張子なしで存在するnews@11可能性があるため、ファイルである可能性もあります。
トリシス

1
renameなどの一部のコマンドでは、引数はバージョン付きアイテムまたはローカルファイル名のいずれかにすることができます。名前変更の場合、ターゲットはピン留めされたリビジョンもスキャンされますが、その後、プレーンな名前として扱われる可能性があります。たとえば、名前@fooをに変更したい場合@barsvn rename @foo@ @barは文句を言い@barます。しかし、それを作るとsvn rename @foo@ @bar@、新しい名前は文字通りになり@bar@ます。これを回避するには、ローカルパスであることを明確にするために./(または.\ Windowsで)追加しますsvn rename @foo@ ./@bar
Zastai 2018年

82

元の答えは正しいですが、おそらく十分に明確ではありません。特定のUNIXコマンドラインオプションは次のとおりです。

svn info 'image@2x.png@'

または

svn info "image@2x.png@"

または

svn info image\@2x.png\@

3つすべてをテストしました。


4
私もテストsvn info icon@2x.png@し、うまくいきました。はい、引用符やスラッシュはありません。
2013

引用の必要性はあなたのシェルに依存します-私はKSHを使用し、確かに引用が必要です( '@'はバックグラウンドでプロセスを実行したいというサインなので)。シェルに応じたYMMV。
David H

うん。私の走行距離はbash高速道路でした:)
2013

1
@Nate今、私はそれを失敗させることはできません-kshの引用符なしでうまくいきます。なぜ私はそれらが必要だと思ったのかわからない-多分他の問題-それは2年前にこれを投稿した...
David H

14

異なるサブフォルダーに複数のファイルを追加するためのソリューション:

for file in $(find ./ -type f -name "*@*.png"); do svn add $file@; done

@ .png」の「png」を、追加するファイルの種類に置き換えるだけです。


ファイル名は必ず引用符で囲むかエスケープしてください(大文字と小文字を区別しないマッチングを行います)。また、ファイル@名がのファイルを特別なケースとして扱う必要がないため、@すべてのファイル名に記号を安全に追加できますfor file in $(find ./ -type f -iname "*.png"); do svn add "$file@"; done。また、このアプローチでは、作業中のローカルコピーと矛盾するファイル/ディレクトリ構造がsvnリポジトリに残っていませんか?
ardnew 2013

execfind を使用する方が簡単かもしれません:find . -type f -name "*@*.png" -exec svn add {}@ \;
Walty Yeung



8

私の場合、@記号が含まれているSVNリポジトリからファイルを削除する必要がありました。

これは機能しません:

svn remove 'src/assets/images/hi_res/locales-usa@2x.png'

しかし、これはしました:

svn remove 'src/assets/images/hi_res/locales-usa@2x.png@'

6

複数のファイルを追加するには、代替ソリューションがあります:

svn status | grep \.png | awk '{print $2"@"}'| xargs svn add

答えを説明してください。
Hemang 2016年

3
grepの代わりにawkを使用できますsvn status | awk '/\.png/ {print $2"@"}'| xargs svn add
。– h3dkandi

1

"move"のような2つの引数を持つsvnコマンドの場合、左側(最初)のパラメーターのみに "@"を追加する必要があります。例えば:

$ svn add README@txt@
A         README@txt

$ svn move README@txt@ README2@txt
A         README2@txt
D         README@txt


$ svn status
A       README2@txt

$ svn commit -m "blah"
Adding         README2@txt
Transmitting file data .
Committed revision 168.

$ svn delete README2@txt@
D         README2@txt

$ svn commit -m "blahblah"
*Deleting       README2@txt

Committed revision 169.

この行は重要です:$ svn move README @ txt @ README2 @ txt

ご覧のとおり、「README2 @ txt」に「@」を追加する必要はありません


0

@David H

@記号をエスケープせずに同様のコマンドを試したところ、問題なく動作しました

svn ci splash.png splash@2x.png@

これは、GNU bash、バージョン3.2.48(1)-release(x86_64-apple-darwin10.0)およびsvn 1.6.16にあります


0

私のために働いた唯一の解決策は@NPikeによって提案された同じものでした

svn revert 'path / to / filename @ ext @'


これは元の質問に対する新しい回答であるべきですか?これはむしろ賛成票またはコメントにする必要があります
Nico Haase

申し訳ありませんが、私の悪い、まだコメントを追加できません
Jonyx4

0

今日、メールアドレスから生成されたファイル名に問題がありました(あまり良い考えではありません!)。

ソリューション、printfオプションの使用 find、およびシェル拡張

 svn add  $(find . -name "*@*.png" -printf "%p@ ")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.