2

少し背景。私が働いている研究室にはたくさんの自作ソフトウェアがあります。プロジェクトの多くは同じソースからのものですが、バージョン履歴はありません。ある時点で、それらのいくつかは異なる実験目的のために分岐されました。現在、そのすべてのソフトウェアをgitリポジトリに配置しています。うまくいけば、これにより、将来的に異なるバージョンをマージできるようになります。

したがって、たとえばproject1 versionA用の新しいgitリポジトリを作成し、そのマスターブランチを呼び出す必要があります。

次に、project1versionBを同じgitリポジトリのブランチにします。

しかし、私はこれに対するきちんとした解決策を見つけていません。これまでの私の最善のアイデアは、次のことを行うことでした。

git init(project1 versionA内)ディレクトリを作成し、コミットしてリモートリポジトリにプッシュします。次に、versionBがある同じコンピューター上の新しい空のフォルダーにそれをプルします。次に、versionBという新しいブランチをチェックアウトし、そのバージョンのすべてをバージョンAの上にコピーします。次に、-aをコミットしてプッシュします。

それは私にgitの2つのバージョン/ブランチを与えるはずです。1つはマスター(versionA)と呼ばれ、もう1つはversionBと呼ばれます。これに伴う問題は、適切な解決策ではないことに加えて、versionAには存在するが、versionBには存在しないファイルが両方に存在するようになることです。これは間違いなく混乱を引き起こし、多くのソフトウェアが特定のフォルダを調べてそこにすべてをロードするため、これは問題になります。

別のアイデアは、コピーする前にバージョンAのものをバージョンBブランチからパージすることです。これで問題は解決しますか?

これは、かなり単純な(そして頻繁に遭遇する)はずの何かを行うための回り道のように思えますか?

4

3 に答える 3

2

別のアイデアは、コピーする前にバージョンAのものをバージョンBブランチからパージすることです。これで問題は解決しますか?

多かれ少なかれ。マスターブランチをコミットしてプッシュした後、作成してcheckout versionB。ここgit rm .で(つまり、ディレクトリを空にして)、versionBのものをコピーし、コミットしてプッシュします。これにより、最初のバージョンBの一種の厄介なコミットレコードが作成される可能性があります。OTOHそうではないかもしれませんが、それは「変更されたfileA」と「削除されたfileA、新しいファイルfileA」の違いにすぎません(これは以前に行ったことがありますが、その点での結果を思い出せません)。

git rm実際:最初にすべてを削除するのではなく、必要のないファイルだけを上書きする方がよい場合があります(面倒な場合を除く)。

于 2012-04-16T16:59:20.463 に答える
2

これらは両方とも異なるバージョンの「project1」であり、2つのバージョン間で大幅な重複が予想されます。私はこれを行います(これは少し非標準です)。2つのディレクトリがあり、1つはverAsrcと呼ばれ、もう1つはverBsrcと呼ばれると仮定します。

$ cd verAsrc
$ git init
$ git branch versionA master
$ git branch versionB master
$ git checkout versionA
$ git add
$ git commit -m 'Project 1 version A'

# now the non-standard part

$ cd verBsrc
$ ln -s verAsrc/.git .git
$ git symbolic-ref HEAD refs/heads/versionB      # change to versionB w/o touching working files
$ git add -A
$ git commit -m 'Project 1 version B'

# Now you are done with verBsrc

$ cd verAsrc
$ git symbolic-ref HEAD refs/heads/versionA

これで、verAsrcにバージョンAとバージョンBの両方が独自のブランチにあるgitリポジトリができました。どちらかをチェックできます。彼らは今独立しています。ただし、ここで重要なのは、versionAからversionBをリベースすることです。

$ git checkout versionB
$ git rebase versionA

GITは共有されているすべてのものを識別し、versionAでバージョンBに移動するコミットを1つだけ生成します。その単一のコミットには、AとBのすべての違いがあります

$ git diff versionA..versionB

行ってもいいはずです。マスターに戻したいものをマージします。verAsrcでリポジトリのクローンを作成します。

于 2012-04-16T17:45:03.047 に答える
1

私が理解しているように、あなたはこれをやっています:

project1 repository
   versionA branch   A
   versionB branch    \--- B

基本的に、versionBはversionA(マスターブランチだと思います)から分岐しており、「コピーした」だけなので、versionAのファイルをversionBブランチに残していました。コミットAは最初のコミットです。

プロジェクトの履歴が失われ、フォークされたコードがないため、空のコミットから分岐することをお勧めします。

project1 repository
   master            M
   versionA branch   |---A
   versionB branch   \---B

コミットMは最初の(空の)コミット(おそらく.gitignoreファイルなどのみを含む)であり、コミットAはバージョンAのファイルのみを含み、コミットBはバージョンBのファイルのみを含みます。

于 2012-04-16T17:12:25.973 に答える