Git diff для копирования вывода, игнорируя .git файлы - PullRequest
0 голосов
/ 31 мая 2018

Я создаю конвейер Jenkins, для которого мне нужно клонировать две ветви master и devlop branch для рабочей области в разные каталоги, сравнивать файлы и вытягивать только измененные файлы в другую директорию.Я использую приведенную ниже команду git diff - только для имени GIT-Develop-Branch GIT-master-master-branch

Как использовать вышеуказанную команду для копирования и вставки измененныхфайлы от dir1 и dir2 до dir3, игнорируя файлы .git.или, пожалуйста, поделитесь, если есть какой-либо другой способ.

1 Ответ

0 голосов
/ 31 мая 2018

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

Обновите для вашего комментария ниже:

Во-первых, вы не ответили на запрос, который я запросил.Поэтому я продолжаю предполагать, что вы хотите develop версии файлов, которые отличаются.До сих пор неясно, что вы хотите сделать, если файл удален или переименован;поэтому руководство, которое я давал ранее по этому вопросу, остается неизменным.

1) Вы сказали, что

я клонировал эти 2 ветви в отдельные каталоги в рабочем пространстве Jenkins

Да, и, как я уже говорил, это не похоже на хорошее использование ресурсов.Как я уже говорил, вам, вероятно, не нужно извлекать оба документа, и даже если вы это сделаете, было бы более эффективно использовать git worktree вместо создания двух полных хранилищ.

2) Вы сказали

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

Тоэто то, что делает оригинальный ответ.

3) Вы сказали

, а также я хотел бы получить все файлы только без каких-либо журналов .git.

A checkout всегда только содержание.История находится в базе данных репо и дублируется, только если вы создаете несколько клонов (отсюда пункт 1 выше).

4) Вы сказали, что

я клонирую основную ветку для сравнениятолько для того, чтобы я мог различать две ветви

Опять же, вам не нужен клон для сравнения.Вам даже не нужна проверенная рабочая копия.Все это отражено в исходном ответе.


Во-первых, вы можете различать ветви, не проверяя их обе.Если вам нужны две рабочие копии для чего-то другого, это нормально, но я все равно не буду использовать их для целей создания diff.(Кроме того, звучит так, как будто вы делаете два клона всего репо; возможно, вы захотите использовать вместо него git worktree, чтобы присоединить несколько рабочих деревьев к одному репо. Но это не имеет ничего общего с вашим вопросом...)

git diff --name-only master develop

В зависимости от того, как вы хотите обрабатывать перемещаемый / переименованный файл (или изменения, которые git может по ошибке интерпретировать как перемещаемый / переименованный файл), вы можете добавить --no-renames вариант.

git diff --name-only --no-renames master develop

Это обеспечит отображение любого пути, связанного с изменением, тогда как без этой опции, если git думает, что fileA было перемещено в fileB, только fileB будет включено в список.Если вы просто пытаетесь получить измененное подмножество каталога develop, это может быть тем, что вы хотите ... но опять же, это зависит от того, что вы пытаетесь сделать.

Относительно этой проблемывопрос о том, как вы хотите работать с файлами, которые находятся в master, но не в develop.В приведенном выше примере переименования fileA будет таким файлом;но также у вас может быть file5, который просто был удален в ветке develop.Хотя параметр --no-renames (или его отсутствие) определяет, появляется ли fileA, по умолчанию в списке будет отображаться file5.Вы могли бы подавить это;если вы не хотите видеть имена файлов для удаленных элементов (или «перед» именами файлов для перемещенных файлов), вы можете использовать

git diff --name-only --diff-filter d master develop

(если вы попытаетесь объединить --diff-filter d с --no-renames,«до» имя перемещенного файла будет отображаться как удаление, а затем будет подавлено параметром diff-filter. Итак, еще раз, дело в том, что вам нужно знать, что вы хотите в своем списке.)

Теперьчтобы скопировать develop версии перечисленных файлов в рабочее дерево, вы можете просто использовать git checkout;и вы можете связать все это вместе с xargs

git diff --name-only --diff-filter d master develop |xargs git checkout develop --
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...