Из комментариев неясно, обеспокоены ли вы эффективностью выполнения операции добавления, вводом, который необходимо выполнить, чтобы указать инструментам, что делать, или обоими.
Я бы не сталбеспокоиться о первом;и если вы беспокоитесь об этом, вы все равно мало что можете сделать.Есть больше шагов, чем кажется разумным, и они включают обработку всего файла;но на самом деле, это не имеет значения, потому что я никогда не видел, чтобы операция размещения одного файла занимала достаточно времени, чтобы беспокоиться об этом.
Что касается количества набираемых текстов, вариантов add
, которые выперечислены самые близкие встроенные предложения поддержки git
.Таким образом, вы можете сделать небольшой сценарий, чтобы дополнить их.Но будет непросто убедиться, что он всегда «делает все правильно».
В частности, сложнее, чем вы могли бы представить, определить «изменения в этом диапазоне линий».Кажущаяся очевидной проблема заключается в том, что добавления и удаления строк изменяют номера строк, которые появляются после них;но вы, вероятно, можете решить эту проблему, определив диапазон номеров строк в терминах текущей рабочей версии файла (поскольку именно на это можно было бы обратить внимание в последнее время при определении диапазона номеров строк) ...
Но большая проблема заключается в обнаружении случая, когда все строки в диапазоне были отредактированы, и этот диапазон перекрывает конец диапазона строк, для которого вы вносите изменения.Например, предположим, что у вас есть файл
1
2
3
4
5
в индексе, а ваша рабочая копия говорит:
1
2
3 THREE
4 FOUR
5 FIVE
Теперь вы указываете, что хотите внести изменения из строк 2-4.
Патч будет выглядеть так:
@@ -1,5 +1,5 @@
1
2
-3
-4
-5
+3 THREE
+4 FOUR
+5 FIVE
И довольно ясно, что в этом случае интуитивный результат равен
1
2
3 THREE
4 FOUR
5
Но написаниекод, который делает это «правильным», не делая другие случаи «неправильными» (относительно одинаково интуитивной интерпретации), не так прост.Иногда это действительно открыто для интерпретации.«Была ли это одна операция, которая изменила три строки? Или одна операция, которая удалила три строки, за которой следовали три операции, каждая из которых добавила строку?во-первых, просматривая код в клочках изменений (а не в произвольных диапазонах строк) и заставляя вас вмешиваться вручную, если вы хотите что-то другое (например, используя режим редактирования патча);а затем, вставив маркеры конфликта (и снова требуя ручного вмешательства), когда интерпретация все еще кажется необходимой.
Таким образом, вы должны сделать упрощающие предположения для создания инструмента и убедиться, что эти предположения действительны при использованииtool.
Таким образом, идея состоит в том, чтобы создать скрипт, который считывает патч из файла, названного его первым аргументом, и редактирует патч на месте;и установите этот скрипт в качестве редактора (то есть, установив переменную окружения GIT_EDITOR
) при запуске git add -e
.Вы должны использовать строки вида @@ -#,# +#,# @@
, чтобы выяснить номера затронутых строк для изменения, использовать эту информацию (и ваши предположения), чтобы решить, хотите ли вы сохранить или отменить данную строку изменений, и если вы хотите отказаться от нее
- если строка начинается с
-
, измените -
на
- , если строка начинается с
+
, удалите строку