Git объединить содержимое файла вне репо (--no-index) - PullRequest
2 голосов
/ 15 февраля 2020

Команда git diff (с флагом --no-index) невероятно хорошо работает для сравнения двух файлов, независимо от того, содержатся ли эти два файла в репо Git или нет.

Пример

$ git diff --no-index -- filea fileb
// shows diff between filea and fileb

Вопрос

Можно ли также использовать Git для выборочного "слияния" (то есть git add) содержимого из один файл в другой, если они не являются частью Git репо? В основном, как git add -p, но не из рабочего каталога в индекс, а из fileb в filea.

Я чувствую, что все основные блоки c (команды слесарного дела) должны быть доступны , Возможно что-то с format-patch и / или apply?

$ <command> filea fileb
// wanted: interactively choose patches/hunks from fileb and apply them to filea

Ответы [ 2 ]

2 голосов
/ 16 февраля 2020

git diff --no-index в значительной степени просто обычный diff, если вы хотите применить блоки изменений к произвольным файлам, используйте обычный инструмент слияния, такой как vimdiff - который еще сложнее различить guish из vimdiff используется как Git mergetool, потому что это то же самое.

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

Но Git сам находит свое рабочее дерево (и репо, и объекты, и индекс ...), только если вы явно не укажете это где они есть. Если у вас где-то есть снимок filea, скажем, на /path/to/filea, вы можете

git --work-tree /path/to add -p filea`

и git обязательно добавит патч с filea на этом пути к filea содержание зарегистрировано в индексе.

1 голос
/ 16 февраля 2020

Команда git add -p - или, по крайней мере, была 1 - большой Perl скрипт. Чтобы просмотреть его, найдите каталог «core»:

git --exec-path

, который напечатает что-то вроде /usr/lib/git-core или /usr/local/libexec/git-core. Именно здесь живут различные Git внутренние двоичные файлы и сценарии.

В любом каталоге, в котором распечатывается, ищите git-add--interactive. Это или был код git add -p.

Эта Perl программа запускает команды Git diff и apply, и ее должно быть относительно легко изменить, чтобы она делала то, что вы хотели бы сделать. Обратите внимание, что это используется для всех git add -p, git reset -p и git checkout -p, поэтому длина его почти 2000 строк.


Люди проекта Git находятся в середине Переписав все это, вы не сможете изменить его. :-) То есть, чтобы сделать запись написанной с C до go быстрой - у вас все еще будет исходный код, и вы все равно сможете изменять его так, как вам нравится, но как программа C она будет намного труднее работать.

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