
私はSVN作業コピーを持っていて、次のコマンドを実行しました
./source * -type f -exec sed "s/@version 0.5.3/@version 0.5.4/" -i {} \; を検索します。
ファイルはすべて更新されていますが、これらのいずれかを実行しても svn は変更を認識しません。
svn ステータス ./source
svn diff ./ソース
svn コミット ./source
また、sed から $? をチェックするスクリプトを書いてみましたが、ファイルを「タッチ」して日付を更新するのは問題ありませんが、sed は常に 0 を返すようです -.-
今何ができるでしょうか? -.-
答え1
問題は、次の使用法にありますfind
:
find dir1 -type f
ディレクトリ構造内のすべてのファイル (.svn
ディレクトリ内のファイルを含む) と一致します。 内のファイルは、に対して.svn
実行するために使用されるファイルですsvn diff
。つまり、本質的には、作業コピーだけでなく、ツリー内のすべてのファイルのコピーが変更されたことになります。
次の構文を試してください:
find ./source * -type f ! -path '*/.svn/*' -exec sed "s/@version 0.5.3/@version 0.5.4/" -I {} \;
答え2
私の場合、実際のファイルへのシンボリック リンクを更新していたことが判明しました。sed in-place update を使用しました。興味深いことに、これによりシンボリック リンクが通常のファイルに変換されます。その後、当然ながら「オブジェクト」タイプが変更されたため、svn は満足しませんでした。
シンボリック リンクを通常のファイルに変更する方法は次のとおりです。
user@host>ls -l txt*
-rw-rw-r-- 1 user user 90 Feb 28 2020 txtfile
lrwxrwxrwx 1 user user 7 Aug 5 11:07 txtln -> txtfile
user@host>sed -i "s/hello/mello/" txtln
user@host>ls -l txt*
-rw-rw-r-- 1 user user 90 Feb 28 2020 txtfile
-rw-rw-r-- 1 user user 90 Aug 5 11:08 txtln
user@host>