2009-05-14 5 views
35

私はSubversionの作業コピーを持っています。ここでは、1つのファイルに対してローカルな変更を加えました。変更は私にのみ関連している、私はそれらをコミットしたくない。 (リポジトリのバージョンには、他のユーザーに適したいくつかのデフォルト値が含まれています。私にとってはそうではありません。Subversion:1つのファイルへのローカルな変更がコミットされないようにしますか?

私は変更をコミットしたくありませんが、 I は、svn updateを実行したときにリポジトリで行われた更新を受け取りたいとします。また、私の作業コピーでは、そのファイルに変更をコミットしたくないだけで、他のユーザーは影響を受けてはいけません。だからsvn:ignoreまたはコミットフックは私の目的に合っていません。

現在、私は単純に実行します。

私は明示的に変更 除く私がコミットしたくない特定のファイルを持つファイルを指定
svn commit file1 file2... 

。私が働いている間

しかし、私は単純に書く習慣があります。

svn commit -m "Log of what I just did" 

を、私は私が不注意現時点で上記のコマンドを使用して「禁止」ファイルをコミットすることを恐れているとき、I私は気配りしていません。

要するに、私が探しているのは、Subversionがそのファイルの変更をコミットしないようにする作業コピーのファイルを「マーキング」する方法です(自動除外でなくてもすべてのファイルをコミットしようとするとエラーになるだけです)。並べ替えのような "衝突"状態のファイル...

このようなことはありますか?

更新:感謝、ありがとう、このvery similar questionを指摘してください。

+0

これはあなたのIDEがあなたのためにできることでしょうか? – Josh

+0

またはtortoisesvnを取得すると、コミットするファイルを選択できます –

+4

どのIDEですか? :-)私は通常、コマンドラインからsvnを使います。 –

答えて

17

作業することができ、いくつかの答えがありました:特定のプロパティが追加されているときにコミットを拒否し、プリコミットフックスクリプトを作成します

  1. 。このプロパティを作業コピーのファイルに追加して、コミットを防ぐことができます。
  2. TortoiseSVNは、特別なチェンジリスト "ignore-on-commit"のファイルを除外します。しかし、これはSVNコマンドラインクライアントでは受け入れられません。

CoverosGeneは、svn commit、デフォルトのコマンドを使用すると、別のチェンジリストに割り当てる場合は、ファイルを除外することができるように、デフォルト・チェンジに動作しますが、私はドキュメント内のその任意の参照を見つけることができないことが示唆されました私のテストではこれは動作しません

SVNコマンドラインクライアントには良い解決策がないので、私は拡張要求hereをオープンしました。この要求は、コマンドライン・クライアントが「無視するコミット」チェンジリストを守ることができることを示唆しています。

更新:今はissue 2858であり、svn:holdプロパティでこれを処理するにはfeature outlineがあります。

2

ロックは確かにあなたが望むものではありません。私は組み込みの機能のいずれかがあなたのためにそれをするとは思わない。

  1. は私が
  2. がコミットコミットしたくないものを削除したファイルのリストを取得します:

    は、あなたが作業している環境に応じて、私はそのスクリプトを記述します。ファイル

の線に沿って何か:

svn status | grep ^M | grep -v exclude.c | awk -F' ' '{print $2}' | xargs svn ci -m "I'm committing something" 

ファイルのリストが本当に静的な場合は、リストを修正してください!

8

私はあなたの問題を理解しています。おそらく、この "禁じられた"ファイルには、あなたのローカルビルド環境にのみ関係する構成設定などが含まれています。バージョン管理されたファイルの変更を無視するようにSVNに直接指示する方法はありませんでしたが、これまで私が使用していた回避策があります。

あなたのファイルが「build.conf」と呼ばれると仮定します。 build.conf.exampleのような名前のSVNバージョンファイル。その後、Makefileやビルドスクリプトなどでbuild.conf.exampleをreal build.confに自動的にコピーします。このファイルはバージョン管理されません。次に、build.confを無視して、各開発者が必要なローカル変更を行うことができます。

しかし、 "より良い方法がなければならない" ...

編集:ここほぼ同じ質問:SVN: Is there a way to mark a file as "do not commit"?

+1

明らかに、これはFAQからの回答です。リポジトリで "禁止された"ファイルが更新されるたびに、svnがローカルの変更を加えたリモートの変更をマージして(必要に応じて衝突を通知する)ようにしたいと考えています。バージョン管理されていないファイルの場合は、手動で行う必要があります。つまり、build.conf.exampleと比較してbuild.confが古くなっている可能性があります。 –

+0

同意、理想的ではありません。 CoverosGeneの答えは「良い方法」と思われます。 SVNの最近のバージョン(1.5以上)でも、それはそうだ。 – akent

2

この質問はSubversion FAQです。しかし、あなたがリポジトリを制御していないなら、答えはあまり役に立ちません。

おそらく、サブバージョンの上にgitであなたのローカルコピーを管理しようとします。利用可能なのは簡単なcourse for gitです。 svnリポジトリの変更を追跡したり、変更をコミットするのにgit-svnを使用できます。それはいくつかの学習と訓練を必要とするでしょう。

8

そのファイルにchangelistを作成して、チェンジリストには気を付けないでください。ファイルはコミットするのを待ってそこに座りますが、デフォルトのチェンジリストで動作する通常のコミットは決してそれを拾いません。

svn changelist mylocal file1 

mylocalと呼ばれるチェンジリストを作成してファイルfile1を割り当てます。

+0

確かに良い解決策ですが、開発者単位でのみ動作します。レポをチェックアウトするすべての人にセットアップできるものではありません。さらに、> 1.5のSVNバージョンでのみ利用可能です。 – akent

+8

チェンジリストは非常にクールですが、あなたが言うことは正しくありません。私がチェンジリスト "mylocal"を作成すると、 "svn commit"は変更されたすべてのファイルを考慮します。私が見る限り、ドキュメントには「デフォルトの」チェンジリストが記載されていません。 –

+0

@akent:1つの作業コピーが欲しいものです –

0

プリコミットフックを使用できます。 フックでsvnlook authorを使用して、変更をコミットしているかどうか確認してください。その場合は、svnlook changedを使用して、禁止されているファイルの1つを変更しているかどうかを確認してください。

3

私の経験から、そのファイルをバージョン管理下に置き、svn:ignoreを使用しないでください。

バージョン管理下にあるファイルを無視することはできず、ハードドライブ(および次回更新時にはすべての作業コピー)からファイルを削除せずにバージョン管理からファイルを削除することはできません。 ..)。しかし、最終的にリポジトリを正しく設定すると、それは魅力的に機能します。オリジナルの設定ファイルの代わりに汎用テンプレートを追加することを忘れないでください(誰もが新しい設定変数などを知っていることになります)。新しいレポのために

:既存のレポのために

mkdir config 
svn add config 
svn propset svn:ignore '*.conf' config 

:、すべての作業コピーにあなたの設定のバックアップを持っているために、必ずその後、レポから(SVNデル)設定を削除し、コミット(注意してください。ファイルは次の更新時にすべての作業コピーで削除されます!バックアップが必要です)、ファイルを復元してigno​​reプロパティを設定します。

もう1つの方法はロックです。誰もファイルをコミットしないことを保証しますが、コミットするたびにエラーが発生します。とても素敵ではありません。

そして3番目の方法 - チェンジセット、SVN 1.5クライアントの新機能。これはきちんとしていますが、1つの作業コピーにのみ関連し、リポジトリにはグローバルには関連しません。手動で設定し、新しいファイルを追加する必要があります。維持するのは難しいです。

4

Tortoisesvnとチェンジリストといえば、ignore-on-commitと呼ばれるチェンジリストが既に用意されています。

5

実際に、プリコミットスクリプトがそのジョブを実行します。

'svnlook diff'を実行するプリコミットスクリプトを作成し、チェンジセットに 'nocommit'という名前のプロパティがある場合はコミットを拒否します。

次に、作業コピーで、コミットしてはいけないファイルに「nocommit」プロパティを設定するだけで済みます。いずれのファイルにも 'nocommit'プロパティがあると、その後のコミットは失敗します。後でファイルの変更をチェックインする必要がある場合は、作業コピーから 'nocommit'プロパティを削除するだけです。

+0

失敗はオプションではありません。無視することは何をすべきかです。 – majkinetor

3

私はここ数年間、あなたが探しているものを正確に達成するシンプルなソリューションを使用してきました。これはNOCOMMITというキーワードと呼ばれます。

私はSVNリポジトリに任意のファイルに文字列NOCOMMITが含まれているかどうかを確認するコミット前フックを持っています。コミットに失敗した場合はコミットに失敗します。

プログラマがコミットしてはならない変更を行うと(たとえば、プロジェクト全体のデータベース接続文字列を会社全体のテストサーバーからローカルのテストサーバーに変更した、または診断デバッグステートメントを追加した1秒間に何千もの行数でログをスパムしている)、彼らは//NOCOMMITというコメントを追加しています。間違ってそれをコミットする心配はありません。時間がコミットになると、彼らが防止されるので、それらがいずれかを余儀なくされていますNOCOMMITのために彼らのDO-ないコミットチェンジにファイル

  • 移動、または
  • 検索し、それの任意の発生を削除し、したがって、それを添付したコードを修正することを願っています。個人的に

、私は明らかに、私はチームで唯一のプログラマ午前私のペットのプロジェクトに取り組ん場合でも、私はそれを使用することNOCOMMITキーワードはとても便利。

ウィンドウを使用している場合、SVNリポジトリのhooksフォルダにあるpre-commit.batというファイルに次のテキストを貼り付けることができます。

:: Stops commits that contain the NOCOMMIT keyword. 
setlocal 
set REPOS=%1 
set TXN=%2   
SVNLook diff %REPOS% -t %TXN% | findstr /I /M /L NOCOMMIT > nul 
if %errorlevel% gtr 0 (
    exit 0 
) else (
    echo Your commit has been blocked because it contains the keyword NOCOMMIT. 1>&2 
    exit 1 
) 

UNIXシステムでは、次のようなものが必要ですが、テストしていないことに注意してください。

#!/bin/sh 
REPOS="$1" 
TXN="$2" 
SVNLOOK=/usr/local/bin/svnlook 
$SVNLOOK diff -t "$TXN" "$REPOS" | grep -i "NOCOMMIT" > /dev/null && { echo "Your commit has been blocked because it contains the keyword NOCOMMIT." 1>&2; exit 1; } 
0

パーソナルブランチを使用して、このファイルを切り替えることができます。あなたはブランチで作業することはありませんsvn status

  • :コマンドと5番目の列に表示された「S」との切り替え状態を確認することができます

    1. :という

      svn cp ^/trunk ^/branches/your_name -m "Creating a personal branch."  
      cd working_copy_of_trunk/sub_path/ 
      svn switch ^/branches/your_name/sub_path/your_file your_file 
      

      注:このように あなたのworking_copy_of_trunkは、あなたが切り替えたファイルを除いてリポジトリのトランクディレクトリに対してまだ同期されているので、あなたのファイルで変更をコミットするたびに、そのファイルに対するコミットはトランク上ではなくブランチ上で行われます。

    2. コピーはサーバ側で完了しました。これはsvnで推奨される方法です。完全なサーバー側のコピーは瞬間的で、サーバー上に余分なスペースを費やすことはありません。しかし、人々はtrunk/tags /とbranches /を含むトップディレクトリをチェックアウトせずに直接トランクすることをお勧めします。そうしないと、このトップディレクトリからアップデートするときにすべてのファイルがローカルで重複します。このような場合は、むしろで最初のコマンドをsubtitute:

      SVNのcp --parents最後に^ /トランク/ sub_path/your_file^/支店/ your_name/sub_path/your_file

      したくない何らかの理由である場合あなたのリポジトリサーバ上の他の場所にあなたのファイルをコピーするには、この方法を外部サーバとsvn:externalキーワード(これはあまりお勧めしません)と組み合わせることができます。

  • +0

    それは確かに有効ですが、1.ブランチを追加してリポジトリをゴミ箱に移動する必要があります。2.作業コピーが矛盾しています。 3.まだ多くのタイピング、めったに問題の価値がある。 –

    1

    すべてのファイルをチェンジリストに追加し、コミットしたくないファイルを削除します。以下に示すように、最終的にチェンジをコミット:上記情報の

    $ svn status 
    M file01 
    M ... 
    M file100 
    M file_not_ready_for_commit 
    
    // This will add all working copy files, can be adjusted to add only relevant files 
    $ svn changelist mychangelist -R . 
    
    // Remove the nascent one(s) 
    $ svn changelist mychangelist --remove file_not_ready_for_commit 
    
    // Commit only the files in the changelist 
    $ svn commit --changelist mychangelist 
    

    ソースも詳細についてhttp://svnbook.red-bean.comへのリンクを有し、このblogあります。すべてのクレジットは、ブログの著者に。

    関連する問題