web-dev-qa-db-ja.com

Subversionのブランチ間でマージしても、すべての新しいファイルが追加されるわけではありません。何故なの?

Subversionにいくつかのブランチを持つソースコードツリーがあります。他のアクティブなブランチでかなり集中的なデバッグセッションを終了したばかりなので、変更を新しいブランチにマージする必要があります。新しいブランチは、古いブランチでのすべての開発の後(明らかに)、すべてのデバッグをコミットする前に、最近トランク(リリースされたコードを表す)から削除されました。試行する svn mergeただし、は、追加されたすべてのファイル間でマージされません。すべてではありませんが、いくつか追加します。

タイムラインは次のとおりです。

  • トランクから分岐して、ブランチdev1を作成します。
  • Dev1のコード、ファイルの変更、ファイルの追加。
  • トランクから分岐して、ブランチdev2を作成します。
  • Dev1のバグ修正、ファイルの変更はファイルの追加は行わない。
  • Dev1のすべての変更をdev2にマージします。

予想通り、新しいファイルを含む多くの変更がありますが、すべてではありません。マージ元のバージョンの範囲に、dev2ブランチを作成したバージョンが含まれているためですか?または、トランクにマージしてからdev2にマージする必要がありますか?

編集:すべてのコードはSubversionに完全にコミットされています。しかし、起こっているのは、ファイルの追加がマージによって伝播されないことだと思います。つまり、以前のマージtodev1はいくつかのファイルを追加しましたが、マージfrom前のマージからのコミットを含むdev1には、追加されたファイルは含まれません

しかし、私はまだチェックしています。

25
staticsan

次のステートメントは正しくありません。

ブランチに追加された後、ブランチで変更されたファイルは、複数のリビジョン間でマージを実行しても追加されません。

これは、マージが完全に壊れていることを意味します。

マージを行うときは、ファイルを作成したリビジョンをマージすることを確認する必要があります。そうしないと、ターゲットがないという警告が表示されます。

もう1つ注意すべき点は、作業コピーにマージしてから、満足できないと判断してすべてを元に戻した場合、新しく追加されたファイルは作業コピーに残っているため、再度マージすると、バージョン管理されていないファイルは、そこでの新しいファイルのマージを妨げるため、それらを見逃すことになります。したがって、「svn status」を実行し、バージョン管理されていないファイルを削除すると、マージが正しく機能することが保証されます。

空のファイルを追加することについてのコメントは行わないでください。新しいファイルには、それがどこから来たのかという履歴がないためです。つまり、コピーではないため、「svnlog」にはその履歴が表示されません。そして最後に、ファイルがギガバイトの写真である場合、リポジトリにはまったく同じコンテキストの2つのコピーがあるため、新しいファイルにマージすることは望ましくありません。履歴とマージおよびコピーすると、リポジトリストレージが節約されます(少なくともrep-sharingが配置されるまで)。

29
Blair Zajac

私はいつもsvn警告が、あなたがどういうわけか失敗したというSubversionの兆候であることを知っていました。次に、ブランチからのマージでスキップされたファイルがたくさんある上記のケースに遭遇しましたが、マージの正しいパスがあることはわかっていました。スキップされたファイルは、ブランチで追加および変更されたが、トランクにはまだ存在していなかったすべてのファイルでした。

次に、これらのファイルはすべて、バージョン管理されていないものの、トランクの作業コピーにすでに存在していることに気付きました。1週間前にテストマージ(ドライランではない)を実行して元に戻しましたが、ファイルがSVNによって物理的に削除されることはありませんでした。クライアント。トランクの作業コピーから物理的に削除するとすぐに、問題は解決しました。

30
JasonZ

Subversionは作業ディレクトリに存在しないファイルにコンテキスト差分を適用しようとしているため、ブランチに追加されてからブランチで変更されたファイルは、複数のリビジョン間でマージを実行しても追加されません(新しいファイル)。 svnから、「不足しているファイルblah.cをスキップしています...」のような警告が表示されます。

これに対処するには、2つの基本的な方法があります。ブランチをコミットし(マージすると問題が発生することがあり、単純に元に戻すことができる方がはるかに良いため、これは常に良い考えです)、ファイルを追加する特定のリビジョンを1つずつマージしてファイルを確認します実際に作業ディレクトリに追加されます。

あなたが持っている他のオプションは、リビジョン全体で追加されたすべてのファイルに対して空のファイルを作成することです(たとえば、unix touchコマンドを使用して)(これらのファイルのリストは、-dry-runでマージするだけで取得できます)指定子とすべての「Skippingmissingfile」警告に注意して)、リビジョンリスト全体(-r 1023:1040など)を使用してマージを実行します。それは変更を新しい空のファイルにマージし、すべてが桃色になるはずです:)

1
Jason Coco

単純な最初にブランチをゆっくりマージする必要があります。つまり、最初にいくつかのリビジョンを作成し、次に他のいくつかのリビジョンを作成します。

すべてのリビジョンを完了したら、svnの[ファイルの追加]ボタンをクリックするだけで、RapidSVNを使用します。使いやすいです。

注:ブランチに追加された後、ブランチで変更されたファイルは、Subversionが作業ディレクトリに存在しないファイルにコンテキスト差分を適用しようとしているため、複数のリビジョン間でマージを実行しても追加されません。 (新しいファイル)。

Svnから「不足しているファイルをスキップしています...」のような警告が表示されます。

0
flik

少しの作業があなたを助けるかもしれません:

  1. Tortoise SVNをインストールするときは、enableコマンドラインクライアントツール(詳細 ここ )を忘れないでください。
  2. 空のフォルダを作成します。
  3. メモ帳を開き、以下のコードをコピーして、Get_all_modified_files.batとして保存します。
    @echo off set SRC_PATH=%1 set /a COUNTER=1 :SET_DES_DIR set DES_PATH=%SRC_PATH%_%COUNTER% if exist %DES_PATH% ( set /a COUNTER=%COUNTER% + 1 goto :SET_DES_DIR ) :GET_MODIFIED_FILES pushd %1 svn st | find "M" > LIST_FILES for /f "tokens=2" %%b in (LIST_FILES) do ( echo f | xcopy "%SRC_PATH%\%%b" "%DES_PATH%\%%b" ) del LIST_FILES popd pause
  4. メモ帳を開き、以下のコードをコピーしてInstall.batとして保存します

    @echo off setlocal enabledelayedexpansion :PREPARE if exist Install.reg del Install.reg if exist Uninstall.bat del Uninstall.bat if exist LIST_FILES del LIST_FILES :GET_DETAIL dir "%0\.." /s /b /o:gn > LIST_FILES set /a COUNTER=1 for /f "tokens=*" %%b in (LIST_FILES) do ( if !COUNTER! == 1 set Get_all_modified_files=%%b set /a COUNTER=!COUNTER! + 1 ) set Get_all_modified_files=!Get_all_modified_files:\=\\! set Get_all_modified_files=@="!Get_all_modified_files! %%1" :CREATE_INSTALL_FILE echo Windows Registry Editor Version 5.00>>Install.reg echo. >>Install.reg echo [HKEY_CLASSES_ROOT\Directory\Shell\Get modified files]>>Install.reg echo. >>Install.reg echo [HKEY_CLASSES_ROOT\Directory\Shell\Get modified files\command]>>Install.reg echo !Get_all_modified_files!>>Install.reg echo @echo off>Uninstall.bat echo echo yes ^| reg delete "HKEY_CLASSES_ROOT\Directory\Shell\Get modified files">>Uninstall.bat echo set ^/p BYE^=Enter any key to exit...>>Uninstall.bat :RUN_AND_REMOVE regedit /s Install.reg if exist Install.reg del Install.reg if exist LIST_FILES del LIST_FILES endlocal :INSTRUCTION echo - Setting done! Using uninstall.bat to remove this feature. echo - In order to use: echo 1.Right-click on which folder you want export files echo 2.Select 'Get modified files' to run command. echo 3.It will create and copy modified files into new folder. set /p BYE=- Hoping it useful! Good bye!

  5. このコマンドのレジストリを追加するには、右クリックして管理者でInstall.batファイルを実行します。

  6. これで、すべてのファイルを取得するSVNフォルダーを右クリックして、メニューですべての変更ファイルを取得を選択することにより、すべての変更ファイルを取得できます。

私のコードがあなたに役立つことを願っています!

0
KhanhNT

(これはこの問題を検索するときのトップ投稿のように思われるので、同じ動作の別の考えられる原因についてコメントします)。

私の場合、マージしようとしたリビジョンの変更の一部すでに手動でマージされています別の開発者によって以前のリビジョンでコミットされました。 SVNは、変更がすでにマージされていることに気づいており、マージにファイルがリストされていませんでした。

この場合、ファイルが実際に正しくマージされていることを確認して、正常に続行する必要があります。

0
user2580621