SVN:ファイルを「コミットしない」としてマークする方法はありますか?


153

TortoiseSVNを使用すると、ファイルをcommit-on-commitチェンジリストに移動できるので、ツリー全体をコミットしても、そのファイルへの変更はコミットされません。

svnコマンドラインツールを使用してそのようなことをする方法はありますか?

編集:を使用するための提案をありがとうsvn:ignore、しかしそれは私が探していたものを完全には行いません。

svn:ignoresvn add&などに影響しsvn importます。無視するファイル名パターンのリストを提供します。

既にソース管理下にあるファイルがありますが、そのファイルに一時的な変更を加えたいので、後でソースツリー全体をコミットするときにコミットしたくありません。私は他にも多くの変更を加えており、ツリーにコミットする前にそのファイルを元に戻すように指示するメッセージをモニターに貼り付けることができますが、svnが自動的にそのファイルをスキップできればよいでしょう。


1
個人のブランチとスイッチのステータスを使用する方法があります。[このテーマに関する私の他の記事を参照してください。] [1] [1]:stackoverflow.com/questions/862950/...
ptitpion

回答:


120

2016年2月時点で、Subversionには「コミットしない」/「コミット時に無視する」機能が組み込まれていません/バージョン1.9。この回答は非理想的なコマンドラインの回避策です

OPが述べるように、TortoiseSVNには組み込みのチェンジリスト「ignore-on-commit」があり、これは自動的にコミットから除外されます。コマンドラインクライアントにはこれがないため、これと同じ動作を実行するには複数のチェンジリストを使用する必要があります(警告付き)

  • コミットしたい仕事用[仕事]
  • 1つは無視したいもの[ignore-on-commit]

TortoiseSVNには前例があるので、私がコミットしたくないファイルの例では「ignore-on-commit」を使用しています。私が行うファイルには「work」を使用しますが、好きな名前を付けることができます。

まず、すべてのファイルを「work」という名前のチェンジリストに追加します。これは作業コピーのルートから実行する必要があります。

svn cl work . -R

これにより、作業コピー内のすべてのファイルが「work」という名前のチェンジリストに再帰的に追加されます。これには欠点があります-新しいファイルが作業コピーに追加されるため、新しいファイルを明確に追加する必要があります。そうしないと、それらは含まれません。次に、これを再度実行する必要がある場合は、「ignore-on-commit」ファイルのすべてを再度追加する必要があります。理想的ではありません-他のユーザーが行っているように、ファイル内の独自の「無視」リストを維持し始めることができます。

次に、除外するファイルについて:

svn cl ignore-on-commit path\to\file-to-ignore

ファイルは1つのチェンジリストにのみ存在できるため、以前の「work」追加の後にこの追加を実行すると、無視するファイルが「work」チェンジリストから削除され、「ignore-on-commit」チェンジリストに配置されます。

コミットしたい修正済みファイルをコミットする準備ができたら、コミットに「--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には、これが将来変更される場合に備えて、長年の問題があります。


1
私はあなたが言及したコマンドで2つのファイルを追加しました: $svn st --- Changelist 'ignore-on-commit': M database.php M config.php それでも、それらはコミット時にリポジトリに送信されました。何か間違ったことはありますか?
Attila Fulop、2012

7
チェンジリスト「ignore-on-commit」にファイルを追加しても、ファイルがコミットされるのを妨げることはありません。TortoiseSVN(Windows GUIクライアント)は "ignore-on-commit"を考慮して組み込まれていますが、コマンドラインsvnは組み込まれていません。元の回答で私が持っていた唯一の提案は、コミットするファイルをチェンジリストに追加し、それをコミットするように伝えること
Joshua McKinnon

7
ignore-on-commitは、間違いなく亀の予約リストです。それがしていることはすべて、デフォルトでGUIで項目がチェックされないようにすることなので、それはTortoise GUI固有の機能です。GUIを使用する場合も、コマンドラインを使用してリストに追加する必要はありません。コミットリスト項目のコンテキストメニューだけで、下部にある変更リストに移動でき、ignore-on-commitは既に定義されています。tortoisesvn.net/docs/release/TortoiseSVN_en/...
tjmoore

これはジャックをしませんでした。それはすべてをコミットしました。
ahnbizcad 2015

機能していません。GUIではなく、コマンドラインソリューションについて具体的に尋ねられた質問です。
2016

26

私もこの状況で一貫して自分自身を見つけました:チェンジリストが機能しない-必要なファイルの大規模なリストを維持するのではなく、コミットしたくないファイルの短いリストを作成たいコミットする!

私はlinuxコマンドラインで作業しているので、私の解決策は次のようにスクリプト/ usr / bin / svnn(はい、2つの「n」を使用します)を作成することです。

#! /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を実行します。これが役に立てば幸いです!


最後に、この答えは実際に正しいです。ツールを書く必要があります。これは実際には不完全です。なぜならsvnn ignore configs/*、ワイルドカードやベルやホイッスルなどの動的オプションを使用したいからです。自分でもそういうふうに書いて、またここに戻ってきます!
Tomasz Gandor 2014

これは素晴らしい!さらに、svn-> svnnのエイリアスを.bashrcに作成します。さらに良いことに、コマンド内で無視するファイルを指定する代わりに、gitのように動作し、フォルダー内の.ignoreファイルをチェックして、パターンに一致するすべてのファイルを無視します。
Tarek、2015

タイピングを再学習する代わりに、タイピングsvnnを呼び出してsvn、このスクリプトをPATHなどのPATHの先頭にある可能性のあるものに配置することを検討してください${HOME}/bin。スクリプト自体から、次にを呼び出します/usr/bin/svn
Joost、2016年

17

リポジトリ内のファイルを無視する方法があるとは思いません。私たちはしばしばweb.configや他の設定ファイルでこれに遭遇します。

完璧ではありませんが、私が最もよく目にして使用する解決策は、.defaultファイルとローカルコピーを作成するための単純なタスクを用意することです。

たとえば、リポジトリにはというファイルweb.config.defaultがあり、デフォルト値があります。次に、すべてのweb.config.defaultファイルの名前を変更するnantタスクを作成し、web.configローカル値にカスタマイズできます。このタスクは、新しい作業用コピーを取得するとき、またはビルドを実行するときに呼び出す必要があります。

また、web.config作成されたファイルを無視して、リポジトリにコミットされないようにする必要もあります。


8

変更リストを確認してください。変更リストには、変更したがコミットしたくないファイルを除外するオプションが用意されています。SVNは、ユーザーが指示しない限り、ファイルを自動的にスキップしません。このファイルが他のファイルと何らかの形で異なることを伝える方法は、変更リストに入れることです。

それはあなたのためにより多くの作業を必要とします、そしてあなたはあなたの作業コピーにチェンジリストを適用することができるだけです(明らかに、「決して更新しない」プロパティをリビジョンに適用することができた場合に起こり得る混乱を想像してください!)。


1
しかし、それがまさに私たちが望んでいることです。たとえば、システムのデフォルトではなく、defaultUserId = yourIdを設定する必要があるソースファイル。
orbfish 2013年

4

私はこのスレッドに来て、いくつかのファイルのみの「アトミック」コミットを作成する方法を探しました。コミット時に一部のファイルを無視する代わりに、別の方法で必要なファイルのみをコミットしました。

svn ci filename1 filename2

多分、それは誰かを助けるでしょう。


あなたの答えは、このスレッドでの適切な提案の1つにすぎません。svn ciは単にのエイリアスsvn commitです。コミットコマンドを使用すると、指定したファイルの特定のコミットを実行できます
oxfn

3

みんな私は解決策を見つけました。TortoiseSVNは私たちが望むように動作するので、Linuxでインストールしようとしました。つまり、Wineで実行しました。驚くほどうまくいきます!あなたがしなければならないすべては:

  1. 「svn changelist 'ignore-on-commit'」を実行して、コミットをスキップするファイルを追加します。
  2. TortoiseSVNを使用してコミットします: "〜/ .wine / drive_c / Program \ Files / TortoiseSVN / bin / TortoiseProc.exe / command:commit / path: '
  3. 除外されたファイルは、デフォルトでコミットのチェックが外され、他の変更されたファイルはチェックされます。これはWindowsの場合とまったく同じです。楽しい!

(CLIでファイルを除外する必要がある理由は、それを行うためのメニューエントリが見つからなかったためです。理由はわかりません。とにかく、これはうまく機能します!)


2

競合するファイルはコミットできません。これを利用して、プライベートな変更をリポジトリから除外できます。これは、少数のファイルで最適に機能します。

の競合を取得するためa-fileに、作業コピー(WC)にはa-fileリポジトリからの最新情報がなくa-file、WCのにはリポジトリ内の変更と同じ場所にある変更(更新しなかった変更)がありますまだ)。上記の条件を待たない場合は、次のa-fileような競合を作成できます
。作業コピー1(WC1)で、「ここで競合を作成します」a-fileなどのテキスト行をの上部に追加します。リポジトリを壊さないように、必要な構文を使用してください。WC1からコミットします。WC2で、「競合したい」などの別のテキスト行をの上部に追加します。WC2から更新しました。現在、aファイルは競合しています。a-filea-file


1

代わりに、svn commit必要なすべてのファイルで実行するヘルパーbashスクリプトを作成し、不要なファイルは実行しません。このようにして、より多くの制御を行うことができます。

たとえば、1行で、拡張子が付いて.hおり.cpp、変更を加えたすべてのファイルをコミットできます(競合は発生しません)。

svn commit -m "" `svn status | grep "^M.*[h|cpp]$" | awk '{print $2}' | tr "\\n" " "`

[h|cpp]パーツの変更/拡張を追加します。-m ""必要に応じて、引用符の間にログメッセージを追加します。


1

提案されたアイデアのいくつかは、次のように実装できます。

PowerShellのWindowsの場合

すべてをデフォルトの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毎回指定する必要がないようにエイリアスを設定できます。追加の利点は、リポジトリに(必要な場合は)コミット時無視リストを保存できることです。

常に再生成されますが、実際に手作業で変更されることはほとんどありません。たとえば、特定のプレースホルダーの構成ファイルにリビジョン番号を追加して、コミットごとにファイルが変更されるようにしますが、手動で変更することはほとんどありません。


1

これがSVNに組み込まれるのを待つのにうんざりしました。ignore-on-commitで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

1

user88044のスクリプトの更新。

アイデアは、コミット禁止チェンジリストのファイルをプッシュし、悪質なスクリプトを実行することです。

スクリプトはコマンドから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 '[^] + $')"

$ IGNORE_FILESのfor i; mv $ DIR / $ i $ DIR / "$ i" _を実行します。完了。

svn "$ @";

$ IGNORE_FILESのfor i; mv $ DIR / "$ i" _ $ DIR / $ iを実行します。完了。

スクリプトは/ usr / bin / svnnに配置されます(sudo chmod + x / usr / bin / svnn)

svnnステータス、svnnコミットなど...


1

TortoiseSVNを使用して、「ignore-on-commit」チェンジリストを直接設定できます。他のすべてのファイルを含む他のチェンジリストを構成する必要はありません

1)[SVNコミット...]をクリックします(コミットは行われません。変更リストのグラフィカルメニューを見つける方法です)2)リストで、除外するファイルを右クリックします。3)メニュー:チェンジリストに移動>コミット時の無視

次にSVNコミットを実行するとき...ファイルは、リストの最後のカテゴリ「ignore-on-commit」の下にチェックされていない状態で表示されます。

テスト対象:TortoiseSVN 1.8.7、ビルド25475-64ビット、2014/05/05 20:52:12、Subversion 1.8.9、-release


1
youps、私はすでにTortoiseSVNのユーザーのために良い情報を与え、tjmooreのコメントを見て...何のコマンドライン tortoisesvn.net/docs/release/TortoiseSVN_en/...
luneyない

これは1.9で壊れていますか?
Jake Hm

1

これはゲームの後半ですが、私はこの問題に対して最も素晴らしいコマンドラインコマンドを見つけました。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を使用して、メッセージと共にコミットコマンドを実行します。コミットを行い、引用されたファイルリストを最後の引数としてドロップします。

その結果、すべてが最終的に私が望む方法で機能します。私はまだこれらのひどいフープを飛び越えることを強制するためにsvnを嫌いですが、私はこれで生きることができます。私は推測する。


0

まったく同じ問題に直面していて、グーグルで何も起こらなかったので、回避策を見つけたと思います。これが私がやったことです、私にとってはうまくいくようですが、古いバージョンのSVN(<1.5、-keep-localオプションがないため)に悩まされており、私はその専門家ではありません、それが普遍的な解決策であると確信できません。それもあなたのために働くなら、私に知らせてください!

他の人が既に作業を始めていたので、私は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できます。


0

ディレクトリプロパティの変更を無視しないソリューション

に基づくソリューションを使用しようとしました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では、現在のdirのプロパティを記録します.)、基本的にMsvn statusコマンドを発行するときに2番目の列にa が付いているディレクトリについて、これを行う必要があります。

解決

パッチとを使用しました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 .


-1

svn:ignore あなたの答えです。

例:

$ svn propset svn:ignore -F .cvsignore .
property 'svn:ignore' set on '.'

1
上記の例は、以前に構成されたcvsignoreファイルをsvnignoreプロパティへの入力として使用する方法を示しています。
ベンホフシュタイン2009年

1
svn:ignoreはバージョン管理外のファイル専用です。バージョンファイルでは機能しない
セルジオ

1
そしてまた、それはローカルではありません。これは、それ自体でコミットされるプロパティの変更です。
Adam Badura 2014年

-9
svn propset "svn:ignore" "*.xml" .

これ*.xmlは無視するファイルのパターンです。ここでもディレクトリ名を使用できます。


3
-1リポジトリの一部であるファイルを無視できないため。
zellus 2010年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.