Как указать путь к драйверу слияния Git в .git / config с пробелами? - PullRequest
0 голосов
/ 15 сентября 2018

Я хочу указать, что пользовательский драйвер слияния, который я использую , находится в корневом каталоге моего репозитория с именем mergebans.py.Я пробовал следующее для путей ...

  • . / Mergebans
  • .. / mergebans
  • . / Mergebans.py
  • ../mergebans.py
  • / home / steam / .config / Секретная лаборатория SCP
  • / home / steam / .config / SCP \ Secret \ Laboratory

Spaces in Git driver causing

$ git merge master
../mergebans.py .merge_file_h3Bq8r .merge_file_2sLmCK .merge_file_H38i62 7: 1: ../mergebans.py .merge_file_h3Bq8r .merge_file_2sLmCK .merge_file_H38i62 7: ../mergebans.py: not found
../mergebans.py .merge_file_knuMAl .merge_file_Pg9f5D .merge_file_Gb0JzW 7: 1: ../mergebans.py .merge_file_knuMAl .merge_file_Pg9f5D .merge_file_Gb0JzW 7: ../mergebans.py: not found

$ git merge master
../mergebans.py .merge_file_TBZ2ia .merge_file_dHaTFA .merge_file_7wEJ20 7: 1: ../mergebans.py .merge_file_TBZ2ia .merge_file_dHaTFA .merge_file_7wEJ20 7: ../mergebans.py: not found
../mergebans.py .merge_file_pzgQqr .merge_file_rvHXOR .merge_file_TYk5ci 7: 1: ../mergebans.py .merge_file_pzgQqr .merge_file_rvHXOR .merge_file_TYk5ci 7: ../mergebans.py: not found

$ git merge master
/home/steam/.config/SCP Secret Laboratory/mergebans .merge_file_sDGMpM .merge_file_GiChes .merge_file_2JJM27 7: 1: /home/steam/.config/SCP Secret Laboratory/mergebans .merge_file_sDGMpM .merge_file_GiChes .merge_file_2JJM27 7: /home/steam/.config/SCP: not found
/home/steam/.config/SCP Secret Laboratory/mergebans .merge_file_OacBRN .merge_file_4qUpGt .merge_file_ElPev9 7: 1: /home/steam/.config/SCP Secret Laboratory/mergebans .merge_file_OacBRN .merge_file_4qUpGt .merge_file_ElPev9 7: /home/steam/.config/SCP: not found

$ git merge master
fatal: bad config line 21 in file .git/config

Как мне исправить .git/config, чтобы правильно найти файл mergebans.py?

1 Ответ

0 голосов
/ 15 сентября 2018

Строка, которую вы определяете в строке driver - независимо от ее текста - передается в вашу оболочку, независимо от того, что такое (если система Unix-ish, вероятно, sh или bash), и она работает в вашу оболочку для обработки строки. Итак, первый трюк - это установить саму строку.

Здесь просто вставка пробелов работает нормально:

[merge "netbeans"]
    driver = this has spaces

Мы можем проверить это с git config --get:

$ git config --get merge.netbeans.driver
this has spaces
$ git config --get merge.netbeans.driver | hexdump -C
00000000  74 68 69 73 20 68 61 73  20 73 70 61 63 65 73 0a  |this has spaces.|
00000010

Оболочка, однако, будет рассматривать это как три "слова"; мы хотим, чтобы три слова были одним словом в терминах оболочки. Здесь обратный слеш будет работать, но git config синтаксический анализ потребляет один уровень обратного слеша, поэтому нам нужно удвоить обратный слеш:

[merge "netbeans"]
    driver = this\\ has\\ spaces

, что дает:

$ git config --get merge.netbeans.driver
this\ has\ spaces

(на этот раз я оставлю читателю hexdump или просмотр других символов).

В качестве альтернативы, мы можем поместить всю строку в двойные или одинарные кавычки. Эксперимент с git config --get показывает, что git config сам по себе не заключает в себе одинарные кавычки:

[merge "netbeans"]
    driver = 'this has spaces'

$ git config --get merge.netbeans.driver
'this has spaces'

но он кушает двойные кавычки:

[merge "netbeans"]
    driver = "this has spaces"
$ git config --get merge.netbeans.driver
this has spaces

Решением для последнего является заключение двойных кавычек, например, с использованием обратной косой черты:

[merge "netbeans"]
    driver = \"this has spaces\"
$ git config --get merge.netbeans.driver
"this has spaces"

(что показывает, почему мы должны были удвоить обратную косую черту ранее).

Что, если таковое имеется, подходит для вашей оболочки , зависит от вашей оболочки. Я обычно предпочитаю двойные кавычки в большинстве случаев, но здесь одинарные кавычки проще всего написать, и они подойдут для моей оболочки, поэтому я бы использовал:

    driver = '/home/steam/...'

(за исключением того, что я бы не стал ставить пробелы в именах путей в первую очередь, чтобы не делать ничего из этого ...).

Наконец, хотя вы, вероятно, do хотите сделать это для этого конкретного случая, редко очень хорошо жестко кодировать полные пути, подобные этому, когда оболочка ищет $PATH для вас. Если существует программа X , к которой другие программы P и Q должны иметь доступ, X должна быть включена $PATH, когда P и Q run. Например, собственные внутренние сантехнические программы Git живут в git --exec-path, поэтому, когда вы запускаете git <em>command</em>, передний конец git вставляет свой собственный путь --exec-path в начало $PATH, а затем просто запускает git-<em>command</em>, который находит первый исполняемый файл с именем git-<em>command</em> в $PATH. Это означает, что вы можете написать свои собственные программы Git, в том числе такие, как стратегии подключения, стратегии слияния или драйверы слияния, и тогда Git и оболочка смогут найти их для вас. Например, если вы напишите команду git-frob, поместите ее где-нибудь в ваш $PATH, а затем запустите git frob, вы обнаружите, что Git запускает вашу собственную команду git-frob (с добавлением $PATH, чтобы указать на код git-core, так что git-frob может легко набрать git-sh-setup.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...