/ / git-svnを使ってローカルのみの変更やチェンジセットを追跡するには? - svn、git、git-svn

git-svnを使ってローカルのみの変更やチェンジセットを追跡するには? - svn、git、git-svn

私は私のローカルgitで追跡するファイルを持っているgit-svn dcommitを実行すると、中央のsvnリポジトリにチェックインされないリポジトリ。私はしばしば、リポジトリ内で追跡されるファイルに対して、長期間にわたってローカルのみの変更を行っています。時にはコードをデバッグするために使用することがあります。また、私が追跡したいプロジェクトIDEファイルもあります。普通の古いsvnでは、単に「XYZ:DO NOT CHECK IN」と表示されたチェンジリストにこれらのファイルを置き、実際にコミットする必要がある変更を実際に行ったときに問題を手動で処理します。

理想的には、私の変更を私のそれらの特定の変更がsvn repoに伝播するのを防ぐ何かを設定します。私は従来の方法でgitとgit-svnを使用しますが、特定のコミットは決してプッシュアップされません。明らかに、私はコミットするたびに手動でこれを行うことができますが、それは痛みです。

私はいくつか考え、廃棄しました。 これらのファイルを除外したいのではなく、時には変更を加える必要があり、IDEファイルの場合のように、これらのファイルが私が作成するローカルのブランチに表示されるのが好きです。しかし、これらの変更を1つのブランチに分離することはできません。IDEファイルのように、すべてのブランチでそれらを変更したいからです。罪悪感やstgitのように見えますが、明らかではありません。彼らは私がまだ学んでいるgitの上に複雑さの独自の層を追加します。

回答:

回答№1は2

私はgitに若干新しいですが、あなたのローカルgitリポジトリに別のマスターと作業ブランチを使用することをお勧めします。

"非SVN"ファイルを作業ブランチに追加するのみ。一般的に、作業ブランチ内のすべてのコード変更を行います。 "非SVN"ファイルが変更された場合は、一意のコミットを使用してファイルを追加し、コミットメッセージプレフィックス(つまり、 "local:"または "private:")を設定します。あなたがSVNにコミットする準備ができたら:

  1. SVNに追加するコミットのログを表示する:

    git co working
    git cherry master
    
  2. すべてのアップストリームコミットをマスターブランチに追加し、 "プライベート"コミットは無視します。すべてのアップストリームコミットがマスターになるまで、この手順を繰り返します。

    git co master
    git cherry-pick <SHA1>
    
  3. SVNリポジトリにコミットする:

    git svn rebase
    git svn dcommit
    

回答№2については2

問題への私の現在の解決策は、スタックされたgit(stg)を使用して、これらのローカル変更を別々のパッチとして維持することです。私がSubversionにdcommitする必要があるとき、私は

stg pop # naming the patches that should not be commited
stg commit # the rest of the patches to commit
git svn dcommit
stg push # naming the patches that are used locally

これらを次のように維持することについての素晴らしいこと個別のパッチは、異なるデータベースバックエンドをテストするために単体テストを変更するパッチを簡単に持つことができるということです。ですから、通常はOracleに対してテストしますが、ダービーと照合したい場合は

stg push local-mods-derby
ant tests
stg pop

PostgreSQLをテストしたい場合は、

stg push local-mods-test-postgresql
ant tests
stg pop

ここで、 "local-mods-derby"と "local-mods-test-postgresql"はパッチ名です。

したがって、作業の別々のパッチを維持することはstgで非常に簡単です。


回答№3の場合は1

あなたはマスターブランチで働いていないと考えましたか?

変更をローカルgitブランチに保存している場合定期的に目的の変更のみをsvnの追跡ブランチにマージするかチェリーピックすることができます。トラッキングブランチに切り替え、dcommitを実行します。その後、あなたの地元の支店に戻り、それをリベースします。

複数のブランチで変更を行う場合は、それらをすべて同じ分岐点から除外します。そのブランチをマスタとし、リベースして変更してください。その後、あなたの他のすべてのブランチに対して、そのベースブランチをリベースします。


回答№4の場合は0

あなたはそれを隠すことを検討したいかもしれません。

git-stash - Stash the changes in a dirty working directory away

あなたが何を記述しているのかは、それが不足しているかもしれません。


回答№5の場合は0

私はいくつかの研究を行い、2つのgitリポジトリが同じディレクトリを指している可能性があります。環境変数GIT_DIRには、ローカルリポジトリディレクトリの名前が格納されます。 unsetの場合、gitのデフォルトは.gitですが、何でもかまいません。

私がすることができることは、1つのリポジトリを持つことです。gitはSubversionリポジトリにマップします。これは普通のケースです。次に、.localgitに別のリポジトリを置くことができます。各リポジトリは、他のリポジトリが管理するファイルを無視するように設定する必要があります。パターンを否定するため。

ローカル専用のファイルを変更するとチェックインするには、GIT_DIR環境変数を変更するか、 - git-dirコマンドライン引数を使用してください。私のexcludes / ignoresが適切に設定されていれば、衝突について心配する必要はありませんが、それを維持するためのオーバーヘッドは明らかですが、除外にファイルを追加するラッパースクリプトを書くことができますファイルがもう一方のレポに追加されたときに1つのレポが表示されます。また、そのオーバーヘッドは、複数のブランチ提案のように、すべてのコミットではなく、ファイルごとに1回のみ発生します。

私がもっと簡単にしたければ、local-onlyファイルの数がほぼ確実に1桁である(そうでなければ私は何か間違っている)ので、私は個々のファイルでそれを行うこともできます。

私がこのアプローチで見ている一つの欠点は、SVNリポジトリのファイルと同じ方法で、ローカル専用ファイルをブランチして隠したりリセットしたりすることができないようにすることができます。これらの変更は、私のメイン編集に関しては非同期になる可能性が高いので、それが実際には重大な問題になると思います。私は、マルチリポジトリを認識していた機能のためのラッパーを書くこともできます。また、ローカル専用ファイルを管理する際にはもっと明示的にする必要がありますが、git自体に組み込まれている複数のリポジトリが不足している状況では、ほとんどすべての状況を処理する必要があります。