Я просто хочу получить список измененных файлов между двумя ревизиями, который прост:
git diff -–name-only commit1 commit2 > /path/to/my/file
Но что мне написать, если я хочу скопировать все перечисленные файлы в другое место? И мне нужна полностью идентичная структура каталогов для скопированных файлов.
Например, я изменил и добавил файлы:
/protected/texts/file1.txt
/protected/scripts/index.php
/public/pics/pic1.png
Я хочу иметь во /home/changes/
всех этих измененных и добавленных файлах:
/home/changes/protected/texts/file1.txt
/home/changes/protected/scripts/index.php
/home/changes/public/pics/pic1.png
git format-patch
может сделать это для диапазонов фиксации.git diff commit1 commit2 > my.patch
а потомcd other/path; patch -p1 < my.patch
. Почему это должно быть сделано с полными копиями файлов? Если это потому, что вы думаете, что патч может не применяться, и, следовательно, другой каталог на самом деле не находится вcommit1
состоянии, вы действительно должны скопировать все изcommit2
состояния ...Ответы:
Попробуйте следующую команду, которую я протестировал:
источник
cp --parents
подсказку, я хотел этот вариант в течение многих лет и никогда не знал, что он существует! ... очевидно, я никогда не удосужился его найти = \--parents
опцияcp
недоступна.IFS=$'\n'
первую очередь может сделать это. (Желательно в недолговечном виде, чтобы не испортить ваше первоначальное значение IFS.)cp: cannot stat 'git diff --name-only': No such file or directory
на git bash на windows. Что я делаю не так? Каталог-Следующее должно работать нормально:
Чтобы объяснить дальше:
Параметр
-z
to withgit diff --name-only
позволяет выводить список файлов, разделенных байтами NUL, а не символами новой строки, на тот случай, если в именах ваших файлов есть необычные символы.Параметр
-0
toxargs
указывает на интерпретацию стандартного ввода в виде списка параметров, разделенных NUL.-IREPLACE
Требуется , так как по умолчаниюxargs
будет добавлять параметры в концеrsync
команды. Вместо этого это говорит, чтобы поместить их, где позжеREPLACE
. (Это хороший совет из этого ответа о сбое сервера .)-a
Параметрrsync
средства для сохранения права, права собственности и т.д. , если это возможно. Способ-R
использования полного относительного пути при создании файлов в месте назначения.Обновление: если у вас старая версия
xargs
, вам нужно использовать-i
опцию вместо-I
. (Первое не рекомендуется в более поздних версияхfindutils
.)источник
xargs --version
говорит?-i
вместо этого, которая устарела в более поздних версиях - 4.1 сейчас довольно старая. Я обновлю свой ответ.-I
в некоторых версиях вам нужен пробел , так что, возможно, попробуйте-I REPLACE
вместо этого.-I
поддерживается только сfindutils
4.2.10, выпущенной в декабре 2004 года.--diff-filter=d
чтобы исключить удаленные файлы из списка. В противном случае вы получите ошибки при попытке скопировать их в папку изменений. В противном случае отличный ответ. Спасибо!Вот одна строка:
Перечислите измененные файлы и упакуйте их как * .zip:
Перечислите последние подтвержденные измененные файлы и упакуйте их как * .zip:
источник
sed.exe
? Я все ещеzip
не найден на окнах.PATH
переменную env.источник
https://stackoverflow.com/users/79061/sebastian-paaske-t%c3%b8rholm
источник
Работает отлично.
источник
Никто не упомянул,
cpio
что легко набирать, создавать жесткие ссылки и обрабатывать пробелы в именах файлов:источник