Подтвердить что ты не робот

Обеспечение относительных путей Git

Я переместил репозиторий Git (содержащий несколько подмодулей) в другой каталог на локальном диске. Любая команда git выдает ошибку:

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

Ошибка выводится из абсолютных путей к файлам, закодированным в разных местах [1]. Два вопроса:

  • Есть ли команда Git для фиксации этих путей, т.е. Делает их относительными? [2]
  • Есть ли способ гарантировать, что в будущих репозиториях Git будут использоваться только относительные пути? [3]

Благодарю!


Заметки

  1. Я замечаю, что со всеми подмодулями файл .git содержит:

    gitdir: <absolute path to repository>
    

    Параметр core.worktree в каждом подмодуле (.git/modules/*/config) устанавливается в абсолютный путь этого подмодуля.

  2. Я не ищу команду оболочки, а скорее собственный метод Git.

  3. Я не уверен, были ли созданы абсолютные пути с более старой версией Git и более новыми, которые с тех пор использовали относительные пути.

4b9b3361

Ответ 1

Я написал oneliner (требуется bash и coreutils), который изменяет любой файл.git gitdir на относительный путь:

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'

Ответ 2

Решение @r3dey3, адаптированное для Windows:

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

Здесь я добавил:

  • chmod +w.git удалить атрибут readonly
  • cygpath -u для преобразования пути Windows в путь Unix

Ответ 3

Я столкнулся с той же проблемой.

Вот суть небольшого скрипта, который я написал, что могло бы помочь.

Это не решает проблему путем преобразования путей в относительную форму, но она выполняет быстрый поиск и замену в соответствующих местах, позволяя вам все исправить. Особенно удобно, если вы имеете дело со сложным набором подмодулей, где может быть много путей для исправления.

Обратите внимание, что я сам использовал этот скрипт на OS X 10.8, но я не могу быть на 100% уверенным, что он работает во всех случаях, поэтому будьте осторожны и принимайте разумные меры предосторожности!

https://gist.github.com/3394771