22

Git リポジトリ (複数のサブモジュールを含む) をローカル ディスクの別のディレクトリに移動しました。どの git コマンドでもエラーが発生します。

fatal: Not a git repository: <absolute path to .git/modules/*>

エラーは、さまざまな場所でエンコードされたファイルへの絶対パスから派生します[1]。2 つの質問:

  • これらのパスを修正する、つまり相対パスにするための Git コマンドはありますか?[2]
  • 将来の Git リポジトリが相対パスのみを使用するようにする方法はありますか?[3]

ありがとう!


ノート

  1. .gitすべてのサブモジュールで、ファイルに次のものが含まれていることに気付きました。

    gitdir: <absolute path to repository>
    

    各サブモジュール内のcore.worktreeパラメーター ( .git/modules/*/config) は、そのサブモジュールの絶対パスに設定されます。

  2. 私が探しているのはシェル コマンドではなく、ネイティブの Git メソッドです。

  3. 絶対パスが古いバージョンの Git で作成されたものであるかどうかはわかりませんが、新しいバージョンでは相対パスが採用されています。

4

4 に答える 4

7

.git gitdir ファイルを相対パスに変更するワンライナー (bash と coreutils が必要) を作成しました。

find -type f -name .git -exec bash -c 'f="{}"; cd $(dirname $f); echo "gitdir: $(realpath --relative-to=. $(cut -d" " -f2 .git))" > .git' \;

気に入らない場合は、git サブモジュールを使用したものを見つけてください。

git submodule foreach --recursive '[[ -f .git ]] && echo "gitdir: $(realpath --relative-to=. $(cut -d" " -f2 .git))" > .git'
于 2016-07-20T19:49:29.727 に答える
4

Windowsに適応した@r3dey3ソリューション:

git submodule foreach --recursive '[[ -f .git ]] && chmod +w .git && echo "gitdir: $(realpath --relative-to=. "$(cygpath -u "$(cut -d" " -f2 .git)")")" > .git'

ここで私は追加しました:

  • chmod +w .git読み取り専用属性を削除するには
  • cygpath -uWindows パスを Unix パスに変換する呼び出し
于 2016-12-02T12:54:56.463 に答える
0

私は同じ問題に遭遇しました。

これは、私が書いた小さなスクリプトの要点です。これは役立つかもしれません。

パスを相対形式に変換することで問題を実際に解決するわけではありませんが、関連する場所をすばやく検索して置換し、すべてを修正できるようにします。修正するパスが多数ある複雑なサブモジュールのセットを扱っている場合に特に便利です。

私自身、このスクリプトを OS X 10.8 で使用したことがありますが、すべてのケースでこのスクリプトが機能することを 100% 確信できるわけではないので、十分に注意して適切な予防措置を講じてください。

https://gist.github.com/3394771

于 2012-08-19T13:48:20.247 に答える