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

194

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

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

Я попробовал это:

  1. git add include

  2. git mv common/ include/

    но это не с этой ошибкой

    фатальный: неверный источник, источник = myrepo / common, пункт назначения = myrepo / include

  3. Я пытался, git mv common/ include/commonно я получаю ту же ошибку

Есть идеи как этого добиться?

lurscher
источник

Ответы:

177

Одна из самых приятных вещей в 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
#
Андрес Яан Тэк
источник
44
Это не работает для меня (с использованием Windows 7, 1.7.6.msysgit.0). Git считает, что старые файлы были удалены, а новые были добавлены.
Барт
Хм, возможно, git использует какую-то внешнюю утилиту для определения одинаковости файлов, которая не работает в Windows? Это была основная часть реализации git.
Андрес Яан Так
13
@OliverF. Исправление: git mvэквивалентно.
Андрес Яан Так
25
«Одна из самых приятных вещей в git» - один из недостатков этой замечательной функции заключается в том, что она начинает давать сбой, когда вы также в значительной степени изменяете файл, который был переименован, что приводит к его удалению и добавлению нового файла. Честно говоря, я бы предпочел вместо этого явную поддержку переименования.
Эрик Каплун
2
Если git преобразует окончания строк, это приводит к проблеме, описанной @Bart. Чтобы это работало, вы должны сделать следующее: git config --global core.autocrlf false
Mariano Dupont
164
 git mv common include

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

Со git mvстраницы руководства :

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

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

" git add" Не должно быть сделано до переезда.


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

Смотрите коммит c57f628 от Matthieu Moy ( moy) для Git 1.9 / 2.0 ( первый квартал 2014 года):

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

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

$ git mv file no-such-dir/
fatal: renaming 'file' failed: Not a directory
VonC
источник
2
Работал отлично - и использование git mvвыглядит гораздо лучше!
Томас Петричек,
23

Команда:

$ git mv oldFolderName newFolderName

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

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

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

Игорь Зворыгин
источник
15

Убедитесь, что вы добавили все свои изменения в область подготовки перед запуском

git mv oldFolderName newFoldername

мерзавец терпит неудачу с ошибкой

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

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

Кевин Плюк
источник
«если есть какие-то не добавленные файлы, то я только что узнал». - Спасибо!
cacoder
3

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

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

Михаил Смоленский
источник
Осторожно: если в имени вашей папки / файла есть пробел, это создаст проблемы!
Dejoma
3

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

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
Локет
источник
Осторожно: если в имени вашей папки / файла есть пробел, это создаст проблемы!
Dejoma
2

Извините, у меня недостаточно репутации, чтобы прокомментировать «ответ» «Andres Jaan Tack».

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

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

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

я пытался

$ 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

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

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

Иван Федорович
источник
Убедитесь, что все ваши изменения были добавлены. Git не может сказать «плохой источник», если есть не добавленные изменения, поэтому я только что узнал.
Кевин Плак
0

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

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

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
  • добавил все файлы из подкаталога (чтобы Git мог добавлять только отслеженные ранее файлы - это было чем-то вроде хитростиgit add --update смены каталога ): (обычно это добавит даже неотслеживаемые файлы - это потребует созданияgit add subdir.gitignore файла)
  • git status показывает теперь только перемещенные файлы
  • переместил остальные файлы из tmpdir в subdir: mv tmpdir/* subdir
  • git statusпохоже мы казнили git mv:)
test30
источник
-1

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

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