Git diff для копирования вывода, игнорируя файлы .git

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

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


person user7836593    schedule 31.05.2018    source источник
comment
... вытаскивать только измененные файлы ... - какая версия измененных файлов? Версия master? Версия develop? Слитная версия с изменениями от обоих?   -  person Mark Adelsberger    schedule 31.05.2018


Ответы (1)


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

Обновите свой комментарий ниже:

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

1) Вы сказали

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

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

2) Вы сказали

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

Это то, что делает исходный ответ.

3) Вы сказали

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

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 --
person Mark Adelsberger    schedule 31.05.2018
comment
привет, я клонировал эти 2 ветки в отдельные каталоги в рабочем пространстве Jenkins. поскольку я создал или добавил несколько файлов в каталог в ветке разработки, я хочу вытащить только те файлы, которые я изменил, вместо того, чтобы тянуть все остальное в третий каталог. а также я хотел бы вытащить все файлы только без журналов .git. Я клонирую основную ветку только для сравнения, чтобы я мог различать две ветки и извлекать только измененные файлы - person user7836593; 31.05.2018
comment
Привет, спасибо за ответ. Я не уверен, как работает git diff, я подумал о клонировании 2 ветвей master (неизмененная ветка) и разработке (измененной ветке) и различении их обоих и вытаскивании только измененных файлов в новый каталог. и я делаю это на сервере Дженкинса. - person user7836593; 31.05.2018