Предположим, я хочу переписать историю Git, перемещая все содержимое /foo/bar
до /baz/quux
для всех прошлых коммитов; работает в Windows.git filter-branch: перемещение папки с -index-фильтром не работает
Я сделал образец репо с двумя фиксаций в /foo/bar
и больше ничего:
git clone https://github.com/jakub-g/filter-branch-test
Давайте положить сценарий, как показано ниже одной папки от моего Git репо и запустить его (подобные вещи упоминаются во многих местах SO, включая https://stackoverflow.com/a/13590229).
#!/bin/bash
PATH_TO_GIT_REPO='./filter-branch-test'
REWRITE_FROM='foo/bar/'
REWRITE_TO='baz/quux/'
cd ${PATH_TO_GIT_REPO} &&
git filter-branch -f --index-filter \
'git ls-files -s | sed "s-\t${REWRITE_FROM}-\t${REWRITE_TO}-" \
| GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info \
&& mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' &&
cd -
Когда я запускаю его:
bash ./runFilterBranch.sh
Выход:
...
WARNING: Ref 'refs/heads/master' is unchanged
и ничего не случилось, я до сих пор есть старые пути.
Когда я запустил git ls-files -s | sed "s-\t${REWRITE_FROM}-\t${REWRITE_TO}-"
в мастер, я вижу, что sed правильно выполняет замены.
Что мне здесь не хватает?
Очевидная проблема в том, что '$ {REWRITE_FROM}' и '$ {REWRITE_TO}' не будет расширяться на месте здесь весь индекс фильтра заключен в одинарные кавычки. Другая потенциальная проблема заключается в том, работает ли здесь '\ t' (я не знаю, работает ли это в' sed', который вы используете). – torek
Да, проблема была связана с одинарными кавычками, предотвращающими расширение. Похоже, пришло время поспать! –