Если вы хотите объединить три или более проектов в одном коммите, выполните действия, описанные в других ответах (remote add -f
, merge
). Затем (мягкий) сбросьте индекс на старую голову (где не произошло слияния). Добавьте все файлы (git add -A
) и скопируйте их (сообщение «Объединение проектов A, B, C и D в один проект). Теперь это идентификатор commit.
Теперь создайте .git/info/grafts
со следующим содержимым:
Запустить git filter-branch -- head^..head head^2..head head^3..head
. Если у вас более трех ветвей, просто добавьте столько же head^n..head
, сколько у вас есть ветви. Чтобы обновить теги, добавьте --tag-name-filter cat
. Не всегда добавляйте это, потому что это может привести к перезаписи некоторых коммитов. Подробнее см. В странице man filter-branch , найдите «трансплантаты».
Теперь, ваш последний commit имеет соответствующих родителей.
for f in template_*.txt; do cp $f foo_${f#template_}; done
[01:22 PM] matt@Lunchbox:~/tmp/ba$
ls
template_x.txt template_y.txt template_z.txt
[01:22 PM] matt@Lunchbox:~/tmp/ba$
for i in template_*.txt ; do mv $i foo${i:8}; done
[01:22 PM] matt@Lunchbox:~/tmp/ba$
ls
foo_x.txt foo_y.txt foo_z.txt
Мой предпочтительный путь:
for f in template_*.txt
do
cp $f ${f/template/foo}
done
"I-don't-remember-the-substitution-syntax" путь:
for i in x y z
do
cp template_$i foo_$
done
Это должно работать:
for file in template_*.txt ; do cp $file `echo $file | sed 's/template_\(.*\)/foo_\1/'` ; done
Я ни о чем не знаю в ударе или на CP, но существуют простые способы сделать этот вид вещи, использующей (например), сценарий жемчуга:
($op = shift) || die "Usage: rename perlexpr [filenames]\n";
for (@ARGV) {
$was = $_;
eval $op;
die $@ if $@;
rename($was,$_) unless $was eq $_;
}
Затем:
rename s/template/foo/ *.txt
for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done
Вероятно, повреждения, если Ваши имена файлов имеют броские символы в них. Удалите '-v' когда (если) Вы получаете уверенность, что он работает надежно.
Команда mmv
(доступный в Debian или Fink или легкий скомпилировать себя), был создан точно для этой задачи. С простым решением для Bash я всегда должен искать документацию о переменном расширении. Но mmv
намного более просто использовать, вполне близко к "великолепию"!;-)
Ваш пример был бы:
mcp "template_*.txt" "foo_#1.txt"
mmv
может обработать более сложные шаблоны также, и это имеет некоторые проверки работоспособности, например, это удостоверится, что ни один из файлов в целевом наборе не появляется в исходном наборе (таким образом, Вы не можете случайно перезаписать файлы).
Еще один способ сделать это:
$ ls template_*.txt | sed -e 's/^template\(.*\)$/cp template\1 foo\1/' | ksh -sx
Я всегда впечатлялся ImageMagick, преобразовывают программу, которая делает то, что Вы ожидаете с форматами изображения:
$ convert rose.jpg rose.png
Это имеет родственную программу, которая позволяет пакетные преобразования:
$ mogrify -format png *.jpg
Очевидно, они ограничены для обработки изображений преобразований, но у них есть интересные интерфейсы командной строки.