получить доступ к имени файла и содержимому файла в git smudge filter - PullRequest
0 голосов
/ 25 марта 2020

Я пишу git фильтр пятен.

.gitconfig

[filter "smudgey"]
    smudge = smudge_filter

smudge_filter

#!/usr/bin/env bash
# $Id Date: Wed, Mar 25, 2020  1:41:34 PM, User: Joey Gough, Branch: master$

IFS=

log_string="\$Log\nhello world"

changed_data=$(sed s/\$Log[^$]*/"$log_string"/g $1)

echo $changed_data

отфильтрованный файл

$Log$

Результат

Когда я извлекаю этот файл, он преобразует тег Log и вставляет «hello world»

$Log
hello world$

Ситуация

Когда я переписываю .gitconfig в следующее:

[filter "smudgey"]
    smudge = smudge_filter --smudge %f

Он выводит две строки, и все.

Я пробовал так много разных подходов, и до сих пор кажется, что я не могу получить доступ к имени файла и содержимому файла одновременно в сценарии Bash.

Вопрос

Как получить доступ к содержимому файла и имени файла одновременно в фильтре git? Или я могу?

1 Ответ

1 голос
/ 26 марта 2020

Как получить доступ к содержимому файла ...

Нет содержимого файла. Или, может быть, лучший способ сформулировать это так: есть содержание . Они не являются (пока) в любом файле .

и имени файла одновременно ...

У вас есть метод получения имени файла с помощью директивы %f.

Важно помнить, что файл еще не существует . 1 содержимое будет go в этот файл после вы фильтруете их!

Если команда sed делает то, что вы хотите , оставьте команду sed как есть. Если вы хотите поместить имя файла куда-нибудь, сделайте это отдельно.

Вот грязный фильтр, который заменяет fill in the blank пробелами и вставляет имя файла вверху:

#! /bin/sh
# invoked as "smudge %f" from .gitconfig settings
printf "%s\n" "$@"
sed 's/fill in the blank/_________________/'

Вот другой фильтр пятен, который заменяет __myname__ на имя файла:

#! /bin/sh
quoted=$(printf "%s" "$@" | sed -e 's,/,\\/,g' -e 's,&,\\&,g')
sed "s/__myname__/$quoted/"

(Уловка в кавычках заключается в том, чтобы убедиться, что $quoted не расширяется до символов, которые влияют на команду sed substitute : forward sla sh - это разделитель, а амперсанд будет заменен левой стороной.)


1 Ну, файл может существовать или не существовать. Это может быть пустым. В вашем случае он, очевидно, существует и в основном или полностью пуст. Здесь существуют различные условия гонки, поскольку фильтрация является частью конвейера, в котором разные процессы выполняют разные задачи.

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

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