19

gitリポジトリの名前を変更することは、より具体的には、プロジェクトを保持する最上位のフォルダーであるため、非常に難しいとは思いません。はい、いくつかのサブモジュールを含むプロジェクトですが、名前を変更する必要があるのは最上位のフォルダーであり、サブモジュールフォルダーではありません。Gitは、そのサブモジュールメカニズムにいくつかの奇妙な絶対パスを記録しているようです。

それを仮定しましょう

  1. すべてのプロジェクトはにあります/tmp
  2. あなたはとを持っていproj_masterますproj_mod
  3. クローンを作成してから、その中のサブモジュールとしてporj_masterクローンをproj_ALL作成します。prom_mod
  4. 名前をに変更proj_ALLproj_onebillionます。その後、黒魔術が起こります。

次の手順で、前述の問題を再現します。私が使用しているgitのバージョンは次のとおりです。

$ git --version
git version 1.7.9.5

  1. 初期化しproj_masterます。

    $ cd /tmp
    $ mkdir proj_master; cd proj_master
    $ git init .
    $ touch README
    $ git add .; git commit -m "hello proj_master"
    
  2. 初期化しproj_modます。

    $ cd /tmp
    $ mkdir proj_mod; cd proj_mod
    $ git init .
    $ touch README
    $ git add .; git commit -m "hello proj_mod"
    
  3. クローンを作成し、サブモジュールとしてproj_masterクローンを作成します。proj_ALLproj_mod

    $ cd /tmp
    $ git clone proj_master proj_ALL
    $ cd proj_ALL
    $ git submodule add /tmp/proj_mod ./mod
    $ git add .; git commit -m "hello proj_ALL"
    $ git status   % Everything is OK.
    
  4. 名前をに変更proj_ALLproj_onebillionます。致命的なエラーが発生しました。

    $ cd /tmp
    $ mv proj_ALL proj_onebillion
    $ cd proj_onebillion
    $ git status
    fatal: Not a git repository: /tmp/proj_ALL/.git/modules/mod
    

注意すべき点の1つは.git、サブモジュールディレクトリ内のファイルです。

$ cat /tmp/proj_ALL/mod/.git 
gitdir: /tmp/proj_ALL/.git/modules/mod

ええ、絶対的な道です。初めて、gitがトップレベルのリポジトリフォルダーの範囲外の何かを認識していることに気付きました。

それでおしまい。サブモジュールフォルダーではなく、トップレベルのプロジェクトフォルダーの名前を変更することをもう一度繰り返します。サブモジュールフォルダの名前を変更しようとしたschmuckの質問を確認したので、私の問題にはあまり役立たないようです。

以前に読んだはずの何かを見逃してしまった場合は、お詫び申し上げます。すべての人に、どんなアドバイスも歓迎します。

4

4 に答える 4

12

いくつかのオプションがありますが、最終的には同じものになります。

再度クローンを作成します

フォルダの名前を変更する代わりに、もう一度クローンを作成します

$ cd /project/original
$ cd ..
$ mkdir moved
$ git init
$ git pull ../original master
$ git submodule init
$ git submodule update

重要な違いを比較original/.git/configmoved/.git/configて対処します(欠落しているブランチは作成する必要があります-欠落しているリモートは構成ファイルに追加する必要があります)。

パスを修正する

プロジェクトフォルダの名前を変更できます。少し調整する必要があります。

  • サブモジュールの.gitファイル参照を修正します。

つまり、これらのファイル:

$ cd /project/moved
$ find -name .git -type f

あなたがする必要があるのは正しいディレクトリを指すようにそれらを編集することです

  • サブモジュールの.git構成ファイルを修正します

つまり、これらのファイル:

$ cd /project/moved
$ find .git/modules/ -name config

ここで、設定を更新しworktreeます。

[core]
    ...
    worktree = /original/path/submodule

[core]
    ...
    worktree = /moved/path/submodule

以上です。

バージョンについてのメモ

1.7.8では、サブモジュールに.gitファイルの使用が導入され、絶対パスが使用されました。これは1.7.10で修正されました。したがって、この問題は、gitバージョン1.7.8および1.7.9で作成されたgitリポジトリにのみ適用されます。

于 2012-05-19T17:00:32.337 に答える
5

同じマシン上で、gitサブモジュールを持つプロジェクトをあるフォルダーから別のフォルダーに移動する場合、更新する必要のあるハードコードされたリンクがいくつかあります。

まず、すべてのサブモジュールには、git構成フォルダーへの絶対パスを格納する.gitファイルがあります(これらは、メインのプロジェクト.gitフォルダー内にあり、modulesフォルダーにグループ化されています)。これらすべてを修正するには、メインプロジェクトのルートから次のコマンドを実行します。

find . -name .git -print0 -type f | xargs -0 sed -i 's|<OLD PATH>|<NEW PATH>|g'

次に、gitサブモジュールの構成ファイルには、作業ディレクトリが保存される行があります。これも絶対です。すべての参照を一度に更新するには、メインプロジェクトのルートから次のコマンドを実行します。

find . -name config -print0 -type f | xargs -0 sed -i 's|<OLD PATH>|<NEW PATH>|g'

OSが*nixの形式であり、パッケージsedがインストールされていることを前提としています。

于 2013-07-02T16:18:34.230 に答える
4

また、各サブモジュールのを確認する必要がありますgitdir

.gitサブモジュールのフォルダファイルにあるはずです。

于 2012-10-15T04:29:20.163 に答える
1

実際に2つのファイルを変更する必要があります

.git/modules/<path-to-submodule>/config
<path-to-submodule>/.git
于 2014-05-06T14:38:00.060 に答える