TortoiseSVNを使用すると、ファイルをコミット時無視チェンジリストに移動できるため、ツリー全体をコミットするときに、そのファイルへの変更がコミットされません。
Svnコマンドラインツールを使用してそのようなことをする方法はありますか?
編集:svn:ignore
を使用する提案をお寄せいただきありがとうございますが、それは私が探していたものとはまったく異なります。
svn:ignore
は、svn add
&svn import
などに影響します。無視するファイル名パターンのリストを提供します。
すでにソース管理下にあるファイルがありますが、ソースツリー全体をコミットするときに後でコミットしたくないファイルに一時的な変更を加えたいと思います。私は他の多くの変更を行っており、ツリーにコミットする前にそのファイルを元に戻すようにモニターにメモすることができますが、svnがそのファイルを自動的にスキップできるといいでしょう。
OPが述べているように、TortoiseSVNには「ignore-on-commit」という変更リストが組み込まれており、コミットから自動的に除外されます。 コマンドラインクライアントにはこれがないため、複数のチェンジリストを使用してこの同じ動作を達成する必要があります(注意事項あり):
TortoiseSVNには前例があるため、コミットしたくないファイルの例では、「ignore-on-commit」を使用します。ファイルには「work」を使用しますが、任意の名前を選択できます。
まず、すべてのファイルを「work」という名前のチェンジリストに追加します。これは、作業コピーのルートから実行する必要があります。
svn cl work . -R
これにより、作業コピー内のすべてのファイルが再帰的に「work」という名前のチェンジリストに追加されます。これには不利な点があります-新しいファイルが作業コピーに追加されると、新しいファイルを明確に追加する必要があります。そうしないと含まれません。次に、これを再度実行する必要がある場合は、「コミット時に無視」ファイルをすべて再度追加する必要があります。理想的ではありません-他のユーザーが行っているように、ファイル内に独自の「無視」リストを維持し始めることができます。
次に、除外するファイルについて:
svn cl ignore-on-commit path\to\file-to-ignore
ファイルは1つのチェンジリストにしか入れることができないため、前回の「作業」追加後にこの追加を実行すると、「作業」チェンジリストから無視するファイルが削除され、「コミット時の無視」チェンジリストに追加されます。
変更したファイルをコミットする準備ができたら、コミットに「--cl work」を追加するだけです。
svn commit --cl work -m "message"
私のマシンでの簡単な例は次のとおりです。
D:\workspace\trunk>svn cl work . -R
Skipped '.'
Skipped 'src'
Skipped 'src\conf'
A [work] src\conf\db.properties
Skipped 'src\Java'
Skipped 'src\Java\com'
Skipped 'src\Java\com\corp'
Skipped 'src\Java\com\corp\sample'
A [work] src\Java\com\corp\sample\Main.Java
Skipped 'src\Java\com\corp\sample\controller'
A [work] src\Java\com\corp\sample\controller\Controller.Java
Skipped 'src\Java\com\corp\sample\model'
A [work] src\Java\com\corp\sample\model\Model.Java
Skipped 'src\Java\com\corp\sample\view'
A [work] src\Java\com\corp\sample\view\View.Java
Skipped 'src\resource'
A [work] src\resource\icon.ico
Skipped 'src\test'
D:\workspace\trunk>svn cl ignore-on-commit src\conf\db.properties
D [work] src\conf\db.properties
A [ignore-on-commit] src\conf\db.properties
D:\workspace\trunk>svn status
--- Changelist 'work':
src\Java\com\corp\sample\Main.Java
src\Java\com\corp\sample\controller\Controller.Java
src\Java\com\corp\sample\model\Model.Java
M src\Java\com\corp\sample\view\View.Java
src\resource\icon.ico
--- Changelist 'ignore-on-commit':
M src\conf\db.properties
D:\workspace\trunk>svn commit --cl work -m "fixed refresh issue"
Sending src\Java\com\corp\sample\view\View.Java
Transmitting file data .done
Committing transaction...
Committed revision 9.
別の方法としては、コミットしたいすべてのファイルを「作業」チェンジリストに追加し、無視リストを維持することもできませんが、これも大変な作業です。本当に、これがSVN自体に実装される場合/場合にのみ、シンプルで理想的なソリューションがあります。 Subversionの問題追跡ツールには、これについて長年の問題があります。 SVN-2858 、これが将来変更される場合に備えて。
私も一貫してこの状況にいることに気付きました:そして、チェンジリストは私には役に立たない-私はdo n'tを大量に維持するのではなく、コミットしたいファイルの短いリストを作りたい私がdoコミットしたいファイルのリスト!
私はlinuxコマンドラインで作業しています。そのため、私の解決策は、次のようにスクリプト/ usr/bin/svnn(はい、2つの 'n's!を持つ)を作成することです。
#! /bin/bash
DIR=/home/mike/dev/trunk
IGNORE_FILES="\
foo/pom.xml \
foo/src/gwt/App.gwt.xml \
foo/src/main/Java/gwt/Common.gwt.xml \
foo/src/main/resources/context/datasource/local.xml \
foo/src/main/resources/context/environment/local.xml"
for i in $IGNORE_FILES; do mv $DIR/$i $DIR/"$i"_; done;
svn "$@"
for i in $IGNORE_FILES; do mv $DIR/"$i"_ $DIR/$i; done;
明らかに、これは私の状況に合わせて調整されていますが、開発環境に合わせてDIRとIGNORE_FILESを変更するだけです。次を使用してスクリプトを実行可能ファイルに変更します。
Sudo chmod +x /usr/bin/svnn
..その後、「svn」ではなく「svnn」を使用して、IGNORE_FILESリストのファイルへのローカル変更をチェックインすることを恐れずにSubversionを実行します。これがお役に立てば幸いです!
リポジトリ内のファイルを無視する方法があるとは思わない。多くの場合、web.configおよびその他の構成ファイルでこれに遭遇します。
完璧ではありませんが、私がよく見かけるソリューションは、.defaultファイルと、ローカルコピーを作成するためのnantタスクを用意することです。
たとえば、レポには、デフォルト値を持つweb.config.default
というファイルがあります。次に、すべてのweb.config.default
ファイルの名前をweb.config
に変更し、ローカル値にカスタマイズできるnantタスクを作成します。このタスクは、新しい作業コピーを取得するか、ビルドを実行するときに呼び出す必要があります。
また、作成されたweb.config
ファイルを無視して、リポジトリにコミットされないようにする必要があります。
changelists をチェックしてください。これにより、変更したがコミットしたくないファイルを除外するオプションが提供されます。 SVNは、指定しない限り自動的にファイルをスキップしません。このファイルが他のファイルとは多少異なることを伝える方法は、変更リストに入れることです。
それはあなたのためにより多くの仕事を必要とします、そしてあなたはあなたの作業コピーにのみチェンジリストを適用することができます(明らかに、あなたがリビジョンに「更新しない」プロパティを適用することができた場合に生じる混chaosを想像してください!).
私はこのスレッドにいくつかのファイルのみの「アトミック」コミットを行う方法を探して来ましたが、コミット時にいくつかのファイルを無視する代わりに、私は別の方法で必要なファイルのみをコミットしました:
svn ci filename1 filename2
たぶん、それは誰かを助けるでしょう。
みんな解決策を見つけました。 TortoiseSVNが希望どおりに機能することを考えて、Linuxにインストールしようとしました。つまり、Wineで実行します。驚くほどうまくいきます!あなたがしなければならないことは次のとおりです。
(CLIでファイルを除外する必要がある理由は、それを行うためのメニューエントリが見つからなかったためです。理由はわかりません。いずれにしても、これはうまくいきます!)
競合するファイルはコミットできません。これを利用して、個人的な変更をリポジトリに入れないようにすることができます。これは、少数のファイルで最適に機能します。
a-file
の競合を取得するために、作業コピー(WC)にはリポジトリの最新のa-file
がなく、WCのa-file
にはリポジトリの変更と同じ場所にある変更(変更した変更)まだ更新していません)。上記の条件を待ちたくない場合は、次のようにa-file
の競合を作成できます。
作業コピー1(WC1)で、"make a conflict here"などのテキスト行をa-file
の先頭に追加します。必要な構文を使用して、リポジトリを壊さないようにします。 WC1からa-file
をコミットします。 WC2では、"i want a conflict"のように、a-file
の先頭に別のテキスト行を追加します。 WC2からの更新で、a-fileが競合するはずです。
User88044のスクリプトの更新。
アイデアは、do-not-commitチェンジリストのファイルをプッシュし、悪のスクリプトを実行することです。
スクリプトは、コマンドからdo-not-commitファイルを抽出します。svn status --changelist 'do-not-commit'
#!/bin/bash DIR = "$(pwd)"
IGNORE_FILES = "$(svn status --changelist 'do-not-commit' | tail -n +3 | grep -oE '[^] + $')"
for i for $ IGNORE_FILES; do mv $ DIR/$ i $ DIR/"$ i" _;完了;
svn "$ @";
for i for $ IGNORE_FILES; do mv $ DIR/"$ i" _ $ DIR/$ i;完了;
スクリプトは/ usr/bin/svnnに配置されます(Sudo chmod + x/usr/bin/svnn)
svnnステータス、svnnコミットなど...
代わりに、必要なすべてのファイルでsvn commit
を実行し、不要なファイルはどれも実行しないヘルパーbashスクリプトを作成します。これにより、より多くの制御が可能になります。
たとえば、1行で、変更を加えた(および競合を引き起こさない)拡張子が.h
および.cpp
のすべてのファイルをコミットできます。
svn commit -m "" `svn status | grep "^M.*[h|cpp]$" | awk '{print $2}' | tr "\\n" " "`
[h|cpp]
部分の拡張子を変更/追加します。必要に応じて、-m ""
の引用符の間にログメッセージを追加します。
TortoiseSVNを使用して、「コミット時に無視」チェンジリストを直接設定できます。他のすべてのファイルを含む他のチェンジリストを構成する必要はありません
1)[SVN Commit ...]をクリックします(コミットしないで、チェンジリストのグラフィカルメニューを見つける方法です)2)リストで除外するファイルを右クリックします。 3)メニュー:チェンジリストに移動>コミット時に無視
次回SVN Commit ...を実行するとき、ファイルはリストの最後の[commit-on-commit]カテゴリの下にチェックなしで表示されます。
テスト済み:TortoiseSVN 1.8.7、ビルド25475-64ビット、2014/05/05 20:52:12、Subversion 1.8.9、-release
これがSVNに組み込まれるのを待つのにうんざりしました。 tortoiseSVNを無視時コミットで使用していましたが、コマンドラインから抑制できないユーザーダイアログボックスが表示されます。戻ってきて、ユーザー入力の10%を待っていることを発見しました。
したがって、変更リストにないファイルのみをコミットするWindows PowerShellスクリプトを次に示します。
# get list of changed files into targets
[XML]$svnStatus = svn st -q --xml C:\SourceCode\Monad
# select the nodes that aren't in a changelist
$fileList = $svnStatus.SelectNodes('/status/target/entry[wc-status/@item != "unversioned"]') | Foreach-Object {$_.path};
# create a temp file of targets
$fileListPath = [IO.Path]::GetTempFileName();
$fileList | out-file $fileListPath -Encoding ASCII
# do the commit
svn commit --targets $fileListPath -m "Publish $version" --keep-changelists
# remove the temp file
Remove-Item $filelistPath
これはゲームに遅れていますが、この問題に対して最も素晴らしいコマンドラインコマンドを見つけました。 bashを使用して完了。楽しい。
svn status | grep -v excluding | sed 's/^A */"/g; s/$/"/g' | tr '\n' ' ' | xargs svn commit -m "My Message"
さて、コマンドの説明は次のとおりです。ユースケースに基づいて変更する必要があるものがあります。
svn status
すべてのファイルのリストを取得します。それらはすべて、それらのステータス文字(?、!、Aなど)で始まります。それぞれが独自の行にあります
grep -v excluding
リストをフィルタリングするにはgrepを使用します。通常(含める)または-vフラグ(除外)で使用できます。この場合、それは除外するために使用されており、「除外する」というフレーズが除外されるものです。
sed 's/^. */"/g; s/$/"/g'
次に、各行の先頭にあるステータス文字と空白を削除し、sedを使用して各行を引用します。一部のファイル名にはスペースが含まれているため、引用しています。
tr '\n' ' '
Trを使用して、すべての改行をスペースに置き換えます。コミットするファイルのリスト全体が1行になりました。
xargs svn commit -m "My Message"
最後に、xargsを使用して、メッセージでcommitコマンドを実行します。コミットを行い、最後の引数として引用されたファイルリストを削除します。
その結果、すべてが最終的に私が望むように機能します。私はまだこれらのひどいフープを飛び越えるように強制することでsvnを嫌いますが、私はこれで生きることができます。私は推測する。
提案されたアイデアのいくつかは、次のように実装できます。
WindowsのPowerShell
デフォルトのlist.ps1にすべて追加
dir -Recurse | ? { -not $_.PSIsContainer } | % { svn cl default $_.FullName }
list.ps1を無視するために追加
dir file1 ... filN % { $_.FullName } > ignore-on-commit
cat .\ignore-on-commit | % { svn cl ignore-on-commit $_ }
svn add ignore-on-commit
これで、svn ci --changelist default
のエイリアスを作成できるので、毎回指定する必要がなくなります。追加の利点は、リポジトリに(必要に応じて)コミット時無視リストを保存できることです。
常に再生成されるが実際には手動で変更されることはめったにないファイルに対してこれを行います。たとえば、特定のプレースホルダーの構成ファイルにリビジョン番号を追加して、コミットごとにファイルが変更されるようにしますが、手動で変更することはまれです。
私がまったく同じ問題に直面していて、グーグルが私に何も与えないので、回避策を見つけたと思います。これが私がやったことです、私にとってはうまくいくようですが、古いバージョンのSVN(-keep-localオプションがないため1.5未満)に固執しているので、私はそれの専門家ではありません、それが普遍的な解決策であるかどうかはわかりません。それもあなたのために働くなら、私に知らせてください!
SVNから入手したPrestashopのインストールを扱っていました。他の人がすでに作業を開始していたからです。 DBの設定は別のサーバーに対して行われたため、/ configフォルダー内のいくつかのファイルで設定を変更しました。このフォルダはすでにバージョン管理されているため、svn:ignoreで設定しても、ローカルの変更がコミットされるのを防ぐことはできません。私がやったことは次のとおりです:
cp config ../cfg_bkp # copy the files out of the repo
svn rm config # delete files both from svn and "physically"
svn propset svn:ignore "config" . # as the files no longer exists, I can add my ignore rule and then...
mv ../cfg_bkp config # ...bring'em back
svn revert --recursive config # make svn forget any existing status for the files (they won't be up for deletion anymore)
これでsvn add --forceを実行できます。リポジトリのバージョンと一致しない場合でも、設定を追加せずにレポのルートで(もう一度変更した場合、テストしなかったので、これをすべてやり直す必要があると思います)。ファイルを上書きしたり、エラーを取得したりすることなく、svn updateもできます。
ディレクトリプロパティの変更を無視しないソリューション
changelist
に基づいたソリューションを使用しようとしましたが、いくつかの問題があります。まず、リポジトリには数千のファイルがあるため、コミットするチェンジリストは膨大であり、svn status
出力は非常に長くなり、有用であるために解析する必要がありました。最も重要なのは、マージから生じた変更をコミットすることでした。つまり、プロパティの変更が含まれることを意味します。チェンジリストをコミットするとき、ディレクトリにアタッチされたsvnプロパティはコミットされないため、追加のコミットを行う必要がありました。
svn ci --cl work -m "this commits files from the work changelist only"
svn up
svn ci --depth empty DIR . -m "record merge properties"
いくつかのディレクトリ(ここではDIR
と現在のディレクトリ.
のプロパティを記録します)について、基本的に2番目の列にM
がsvn status
コマンドを発行するときに記録しなければなりません。
ソリューション
パッチとsvn patch
を使用しました。擬似コード内:
svn diff $IGNORE_FILES > MYPATCH # get the mods to ignore
svn patch --reverse-diff MYPATCH # remove the mods
svn ci -m "message" # check-in files and directory properties
svn patch MYPATCH # re-apply the mods
他のポスターと同様に、無視するファイルのリストを管理するスクリプトを使用することになります。
#! /usr/bin/env bash
finish() {
svn patch MYPATCH # re-apply the mods
}
trap finish EXIT
IGNORE_FILES="\
sources/platform/ecmwf-cca-intel-mpi.xml \
runtime/classic/platform/ecmwf-cca.job.tmpl \
runtime/classic/platform/ecmwf-cca-intel.xml"
svn diff $IGNORE_FILES > MYPATCH # get the mods to ignore
svn patch --reverse-diff MYPATCH # remove the mods
svn "$@"
通常、ci
およびrevert -R .
とともに使用しました。