1

シェルスクリプトを使用して、データファイルで提供された^M文字を置き換えるパッチを作成しました。

sed 's/^M//g' source_file > target_file

しかし、subversionシェルスクリプトのソース管理に使用していて、すでにeol-style:nativeプロパティを指定しているためです。UNIXボックスを使用すると、これ^Mは新しい行に置き換えられ、svn update

sed 's/
//g' source_file > target_file

より良い方法として、これを次のように置き換えることをお勧めしsedますdos2unix

dos2unix source_file > target_file

これにより^M文字が削除されましたが、副作用として、変換されるべきではないsource_fileで使用可能ないくつかの意味のあるデータも置き換えられました。

では、シェルスクリプトを介してデータファイルから^ M文字を削除し、Subversionを介してWindowsおよびLinuxマシンに移植できるようにする方法が必要ですか?

そのような問題を取り除くためのベストプラクティスは何ですか?

4

2 に答える 2

6

あなたが見ているのは、誰かがWindowsでファイルを編集し(おそらくメモ帳を使用して)、ファイルをSubversionリポジトリにコミットしていることです。これにより、Makefileとシェルスクリプトを台無しにする行末が追加されます。

幸いなことに、優れたプログラムエディタ(つまり、メモ帳ではない)は、さまざまなファイルの行末が異なることを理解でき、行末を保持し、変換することさえできます。これは、UnixシェルスクリプトまたはMakefileを作成しているWindowsマシンで作業している人が、理論的には、表示されているものを排除できることを意味し^Mます。開発者には、この問題を処理するEclipseなどのIDEを使用するか、少なくともVIMやNotepad ++などのプログラムエディターを使用することをお勧めしますが、多くの場合、メモ帳を使用してすべてを台無しにするのが好きです。

あなたがしなければならないことは、開発者に正しいプログラミング環境を使用し、ファイルを台無しにするのをやめるための適切なインセンティブを与えることです。

ここにいくつかの推奨事項があります。

  1. 開発者のすべての椅子に高圧線を配線して、メモ帳を使用してファイルを編集するたびに、すぐに1,000ボルトの衝撃を与えることができます。

  2. Subversionの組み込みメカニズムを使用して、これらのファイルの行末を処理できます。

最初のアプローチは非常に魅力的ですが、後者のアプローチを強くお勧めします。svn:eol-styleSubversionには、ファイルで終わる正しい行を強制的に自動的に作成できるというプロパティがあります。たとえば、に設定snv:eol-styleしたLF場合、ファイルはコミットまたはチェックアウトされたときに常に正しい改行行末を持ちます。このように、これらの行末を削除するために後処理を行う必要はありません。問題が解決しました。

唯一の問題は執行の問題です。開発者が新しいファイルを作成したり、古いファイルを編集したりする場合は、プロパティもsvn:eol-style正しい値に設定する必要があります。Subversionにはこれを実行できるauto-propメカニズムがありますが、開発者がそれを使用することを確認する方法はありません。

このプロパティがアタッチされていない場合、ファイルのコミットを拒否できるpre-commitフックを使用します。このフックスクリプトを設定して、このタイプの行末を必要とするファイル(Unixスクリプト、Makefilesなど)と影響を受けないファイル(Javaソースコード、XMLなど)のみを設定できるようにする必要があります。 。

私のpre-commitフックは、セットアップと使用がかなり簡単です。制御ファイルを使用して、必要なものを設定します。例えば:

[PROPERTY All Unix Scripts must have "svn:eol-style" set to "LF"]
match = .\(sh|pl|py|ksh|csh)$
property = svn:eol-style
value = LF
type = string

[PROPERTY All Makefiles must have "svn:eol-style" set to "LF"]
match = [Mm]akefile
property svn:eol-style
value = LF
type = string

これにより、開発者は最初に正しい行末のファイルをチェックインするので、後処理スクリプトを実行する必要はありません。これにより、展開プロセスが大幅に簡素化され、エラーの最大の原因の1つが排除されます。

于 2012-08-31T13:24:58.947 に答える
2

どうsed 's/\r$//'ですか?シーケンスを使用して\rキャリッジリターンを示し、改行の直前でのみ削除します。

于 2012-08-31T08:19:34.467 に答える