Git команда перемещения папки внутри другой

Я создал папку common с кучей исходных файлов и папок.

Теперь я хочу переместить папку common в папку include, чтобы она выглядела как include/common

Я пробовал:

  • git add include

  • git mv common/ include/

    но он не справляется с этой ошибкой

    фатальный: плохой источник, источник = myrepo/common, destination = myrepo/include

  • Я пробовал git mv common/include/common, но получаю ту же ошибку

Любая идея, как достичь этого?

Ответ 1

Одна из самых приятных вещей о git заключается в том, что вам не нужно отслеживать переименование файлов явно. git выяснит это, сравнив содержимое файлов.

Итак, в вашем случае не работайте так сложно:

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

Запуск git status должен показать вам что-то вроде этого:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    common/file.txt -> include/common/file.txt
#

Ответ 2

 git mv common include

должен работать.

На странице git mv:

git mv [-f] [-n] [-k] <source> ... <destination directory>

Во второй форме последним аргументом должен быть существующий каталог; данные источники будут перемещены в этот каталог.
Индекс обновляется после успешного завершения, но изменение все равно должно быть выполнено.

Нет "git add" перед перемещением.


Примечание: "git mv A B/", когда B не существует в качестве каталога, должен произойти ошибка, но это не так.

См. commit c57f628 Matthieu Moy (moy) для Git 1.9/2.0 (Q1 2014):

Git используется для обрезки конечной косой черты и делает команду эквивалентной "git mv file no-such-dir", которая создала файл no-such-dir (в то время как конечная косая черта явно указывала, что это может быть только каталог).

Этот патч пропускает удаление конечной косой черты для пути назначения.
Путь с завершающей косой чертой передается для переименования (2), который выдает сообщение с соответствующим сообщением:

$ git mv file no-such-dir/
fatal: renaming 'file' failed: Not a directory

Ответ 3

Команда:

$ git mv oldFolderName newFolderName

Обычно работает нормально.

Ошибка "плохой источник..." обычно указывает, что после последнего коммита были некоторые переименования в исходном каталоге, и, следовательно, git mv не может найти ожидаемый файл.

Решение прост - просто зафиксируйте перед применением git mv.

Ответ 4

Перед запуском

убедитесь, что вы добавили все свои изменения в промежуточную область.
git mv oldFolderName newFoldername

git с ошибкой

fatal: bad source, source=oldFolderName/somepath/somefile.foo, destination=newFolderName/somepath/somefile.foo

если есть какие-то неадресные файлы, поэтому я только что узнал.

Ответ 5

Другой способ переместить все файлы в каталог в подкаталог (сохраняет git history):

$ for file in $(ls | grep -v 'subDir'); do git mv $file subDir; done;

Ответ 6

У меня была аналогичная проблема с git mv, где я хотел переместить содержимое одной папки в существующую папку и в итоге оказался с этим "простым" script:

pushd common; for f in $(git ls-files); do newdir="../include/$(dirname $f)"; mkdir -p $newdir; git mv $f $newdir/$(basename "$f"); done; popd

Объяснение

  • git ls-files: найдите все файлы (в папке common), отмеченные в git
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir;. Создайте новую папку внутри папки include с той же структурой каталогов, что и common
  • git mv $f $newdir/$(basename "$f"): переместите файл во вновь созданную папку

Причиной этого является то, что git, похоже, проблемы с перемещением файлов в существующие папки, и он также потерпит неудачу, если вы попытаетесь переместить файл в несуществующую папку (следовательно, mkdir -p).

Самое приятное в этом подходе заключается в том, что оно касается только файлов, которые уже проверены на git. Просто используя git mv для перемещения всей папки, и папка содержит неустановленные изменения, git не знает, что делать.

После перемещения файлов, которые вы, возможно, захотите очистить репозиторий, чтобы удалить все оставшиеся неустановленные изменения, просто помните, чтобы сначала просочиться!

git clean -fd -n

Ответ 7

Прошу прощения, у меня недостаточно репутации, чтобы прокомментировать "ответ" "Андрес Яан Так".

Я думаю, что мой messege будет удален (( Но я просто хочу предупредить "lurscher" и других, которые получили ту же ошибку: будьте осторожны, делая

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

Это может привести к тому, что вы не увидите историю проекта git вашего проекта в новой папке.

Я пробовал

$ git mv oldFolderName newFolderName

есть

fatal: bad source, source=oldFolderName/somepath/__init__.py, dest
ination=ESWProj_Base/ESWProj_DebugControlsMenu/somepath/__init__.py

Я сделал

git rm -r oldFolderName

и

git add newFolderName

и я не вижу старую историю git в моем проекте. По крайней мере, мой проект не потерян. Теперь у меня есть проект в newFolderName, но без истории (

Просто хочу предупредить, будьте осторожны, используя совет "Andres Jaan Tack", если вы не хотите потерять свой git hsitory.

Ответ 8

У меня была аналогичная проблема, но в папке, которую я хотел переместить, у меня были файлы, которые я не отслеживал.

скажем, у меня были файлы

a/file1
a/untracked1
b/file2
b/untracked2

И я хотел переместить только отслеживаемые файлы в подпапку subdir, поэтому цель была:

subdir/a/file1
subdir/a/untracked1
subdir/b/file2
subdir/b/untracked2

что я сделал:

  • Я создал новую папку и переместил все файлы, которые меня интересовали: mkdir tmpdir && mv a b tmpdir
  • извлечены старые файлы git checkout a b
  • создал новый каталог и переместил чистые папки (без необработанных файлов) в новый поддиректор: mkdir subdir && mv a b subdir
  • добавил все файлы из subdir (поэтому Git мог добавлять только отслеженные ранее файлы - это было что-то вроде git add --update с трюком смены каталога): git add subdir (обычно это добавляло бы даже не проверенные файлы - для этого потребовалось бы создание .gitignore)
  • git status показывает теперь только перемещенные файлы
  • переместил остальную часть файлов из tmpdir в subdir: mv tmpdir/* subdir
  • git status выглядит как выполненный git mv:)

Ответ 9

Я решил это на окнах, выполнив это:

  • Открытая консоль Power Shell
  • Run Dir
  • Удерживая клавишу "Alt", перетащите курсор на столбец имени файла/папки, затем
  • Вставить в notepad++
  • запустить заменить на регулярное выражение: заменить (.*) на git mv ".\\\1" ".\\<New_Folder_Here>\"
  • скопировать весь текст из notepad++ в powershell
  • нажмите ввод