Перемещение каталога .git
У меня есть репозиторий, который я создал на ранней стадии обучения проекта. Поскольку я узнал больше, я понял, что это создает проблемы, потому что некоторые из файлов, которые я хочу отслеживать, не требуются в скомпилированном источнике. Я хотел бы создать новый родительский каталог проекта, переместить существующий каталог источника в родительский каталог и перенести файлы, которые не нужно компилировать в этот родительский каталог.
Возможно ли это с помощью git? Я полностью уничтожу все ссылки, так как я хочу переместить каталог .git/
до родительского уровня?
Спасибо.
Ответы
Ответ 1
Один из вариантов - просто перемещать вещи внутри вашего текущего репозитория.
Например, предполагая что-то вроде:
/.git
/lib/lib.c
/lib/lib.h
/test.c
/readme.txt
Вы можете создать новую папку (src ниже) и переместить папку lib и папку test.c в новую (используя git mv). Тогда текущий каталог будет вашим родительским каталогом "project", который вы хотите, и весь код будет в новой папке.
/.git
/src/lib/lib.c
/src/lib/lib.h
/src/test.c
/readme.txt
Альтернативой будет git filter-branch, как указано VonC в комментариях. Используя это, я считаю, что вы могли бы построить реорганизованный репозиторий, который не имел бы фиксации для ходов, файлы всегда существовали бы в новой структуре.
Ответ 2
В согласии с Крисом Шаффером вы можете использовать следующий script для выполнения следующих шагов:
fullpath=`pwd`
dirname=`basename $fullpath`
if [ ! -d ./.git ]; then
echo 'Working directory contains no .git repository. There is nothing to move.'
elif [ -d ../.git ]; then
echo 'Parent directory already contains a .git repository. Aborting.'
elif [ -d $dirname ]; then
echo "There already a $dirname directory. Aborting to be safe."
else # Enough checking; let get some work done...
mkdir $dirname
shopt -s extglob
for file in `ls -a | egrep -v [.]git\|^[.]+\$\|^$dirname\$`; do
git mv $file $dirname/
done
mv .git* ..
mv $dirname/* .
mv html/.[a-z]* .
git commit -m "Moved Git repository up one directory"
rmdir $dirname
fi
Это может быть немного больше проверки, чем требуется для разовой ситуации, но она должна выполнять эту работу. Вы можете адаптировать его вручную или сохранить в качестве исполняемого файла script, а затем вызвать его из каталога, содержащего .git.
По-видимому, другим удалось просто mv .git ..
, но это не сработало для меня. Я должен сначала выполнить все операции git mv file
, а затем переместить все до одного.
Если я сделаю это более надежным в будущем, я опубликую обновления на https://github.com/jcamenisch/dotfiles/blob/master/bin/mv-git-up.