Перемещение каталога .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.