2

svnのディレクトリのステータスを取得し、それをループしてファイルを追加または削除するシェルスクリプトを作成しています。

このsvnコマンド

$ svn status /myLocalDir/files

ローカルで追加または削除したファイルを返します。?=追加、!=削除

!        /myLocalDir/files/deletedPicture.png
?        /myLocalDir/files/addedPicture.png

bashスクリプトでループを使用しています(以下を参照)。私がする必要があるのは、追加または削除されたファイル/フォルダのルートディレクトリをループするときに、次のことを行う必要があることです。

A.「削除」[X]または「追加」[X]を印刷します

B.最初の文字(?、!)に基づいて、ループ内の現在のファイルをsvnに削除または追加する必要があるかどうかを判断します。

文字列"!/myLocalDir/files/deletedPicture.png"を解析してそれを行う方法の構文がわかりません。

for X in `svn status /myLocalDir/files | cut -c 8-300`
            do  
                if [ "!" ]
                    then
                        echo "Deleting " $X
                        #svn $CREDENTIALS delete $X
                    else
                        echo "Adding " $X
                        #svn $CREDENTIALS  add $X
                fi

            done

私が気付いているもう1つのこと..コマンドラインでsvnステータスを考えても

!        /myLocalDir/files/deletedPicture.png
?        /myLocalDir/files/addedPicture.png

私のbashループエコーはこのようなものです

!        
/myLocalDir/files/deletedPicture.png
?
/myLocalDir/files/addedPicture.png
4

5 に答える 5

3

Xコードの記述方法では、行全体ではなく単一のフィールドになります。これを試して:

while IFS= read -r status file; do
    case $status in
      \! )  echo "Deleting" ;;
      \? ) echo "Adding" ;;
      # etc.
    esac
done <( svn status /myLocalDir/files )

返されるステータス コードに一致するようにパターンを変更し、svn status必要なコードをechoこのスケルトンの s の代わりに配置できます。

編集: Josh のコードを回答に追加して、より適切な書式設定を提供します。

while read -r line; do
    file="${line#????????}"        # Strip off the 7 flag columns and the separator
    status="${line%$file}"         # Get the 7 flags columns
    case "$status" in 
        '!'*) echo "Do something" ;;
        '?'*) echo "Do something else with $file";;
    esac
 done <( svn status /myLocalDir/files )
于 2013-01-10T21:45:42.450 に答える
2

すべての入力をありがとう!! しかし、これは私が行ったものです..私が本当に必要としたのは、削除された文字列と追加された文字列の最初の文字に基づいてベースを決定することだけだったので、それを部分文字列化しました。スペースをダッシュ​​に置き換えて for ループの問題を解決し、条件に合わせてそれぞれを部分文字列にしました

for X in `svn status /myLocalDir/files |tr " " "-"`
            do  
                if [ ${X:0:1} == "!" ]
                    then
                        echo "Deleting " ${X:8}
                        svn delete ${X:8}
                    elif [ ${X:0:1} == "?" ]
                        echo "Adding " ${X:8}
                        svn add ${X:8}
                fi

            done
于 2013-01-10T22:31:17.567 に答える
1

チェックしたいのが最初の単語だけで、残りを2番目の単語と見なす場合は、次のことができます。

svn status /myLocalDir/files | while IFS= " " read -r line;
            do  
            read a b <<<$line

                if [ $a == "!" ]
                    then
                        echo "Deleting " "$b"
                        #svn $CREDENTIALS delete $b
                    else
                        echo "Adding " "$b"
                        #svn $CREDENTIALS  add $b
                fi
            done 
于 2013-01-10T21:27:28.760 に答える
0

OK、もっと簡単でエレガントな (あるいは正しい) 方法でそれを行うことができます

  • ツリー内のすべての新しいファイルを 1 つのコマンドで追加する: svn add --force /myLocalDir/files/*(バージョン管理されたファイルが既に存在するため、--force が必要です。それ以外の場合は、「... は既にバージョン管理下にあります」という警告が生成されます)、--force なしで使用できる可能性がありますが、出力を抑制するために -q を使用
  • 大きなバシズムなしで追加|削除するためのパイプ付きのワンライナー:

svn status | awk '/\?/ {print $2}' | xargs svn add

svn status | awk '/\!/ {print $2}' | xargs svn rm

于 2013-01-10T21:50:26.823 に答える
0

編集: 統計のすべての可能なフィールドを追加しました。svn help statusその意味と値については、 を参照してください。

treeConflict=" "
oldIFS="$IFS"
IFS=$'\n'
for line in $(svn stat "$path")
do 
   if [[ "$treeConflict" == "C" ]]; then
       continue # skip or handle tree conflict line
   fi

   operation="${line:0:1}"
   modifications="${line:1:1}"
   lock="${line:2:1}"
   history="${line:3:1}"
   external="${line:4:1}"
   repoLock="${line:5:1}"
   treeConflict="${line:6:1}"
   file="$(echo ${line} | sed "s#^.......##")"
done
IFS="$oldIFS"
于 2013-01-10T21:52:19.517 に答える