Я сталкиваюсь с объединением нескольких репозиториев в один, с разным файлом, перемещенным вокруг
Основываясь на некоторых исследованиях SO, SO, как объединить репозитории Я закончил следующимsketch:
user=some_user
new_superproj=new_proj # new repository, will include old repositories
hosting=bitbucket.org # gitgub etc
r1=repo1 # repo 1 to merge
r2=repo2
...
# clone to the new place. These are throw-away (!!!) directory
git clone git@${hosting}:${some_user}/${r1}.git
git clone git@${hosting}:${some_user}/${r2}.git
...
mkdir ${new_superproj} && cd ${new_superproj}
# dummy commit so we can merge
git init
dir > deleteme.txt
git add .
git commit -m "Initial dummy commit"
git rm ./deleteme.txt
git commit -m "Clean up initial file"
# repeat for all source repositories
repo=${r1}
pushd .
cd ../${repo}
# In the throw-away repository, move to the subfolder and rewrite log
git filter-branch --index-filter '
git ls-files -s |
sed "s,\t,&'"${repo}"'/," |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info &&
mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE
' HEAD
popd
# now bring data in to the new repository
git remote add -f ${repo} ../${repo}
git merge --allow-unrelated-histories ${repo}/master -m "Merging repo ${repo} in"
# remove remote to throw-away repo
git remote rm ${repo}
Пока все хорошо, если только мы не хотим перемещать файлы, сохраняя при этом журнал.Git - отстой при перемещении / переименовании, и фрагмент перезаписи журнала не совсем адаптирован, следовательно, перезапись выполняется единообразно, рекурсивно для всего каталога
Идея в том, что пока файлы перемещаются, мы знаем, что в репозитории нет других изменений, кроме переименованийи движется.Итак, как я могу переписать следующую часть, чтобы быть каноническими, для файла.Взято из git filter-branch, официальная документация
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&newsubdir/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
Мне трудно разобраться с тем, что произошло после 'sed' и как оно применяется для git filter-branch
Я хочу запустить скрипт (bash, python и т. Д.), Так:
for each file in repository get moved/renamed
...
# in the loop, moved/renamed file found
old_file="..." # e.g. a/b/c/old_name.txt
new_file="..." # e.g. a/b/f/g/new_name.txt, at this point it is known, old_file and new_file is the same file
update_log_paths(old_file, new_file) # <--- this part is needed
Есть идеи?