2010-10-10 2 views
133

Я создал папку common с кучей исходных файлов и папок.git command для перемещения папки внутри другого

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

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

  1. git add include

  2. git mv common/ include/

    но он терпит неудачу с этой ошибкой

    fatal: bad source, source=myrepo/common, destination=myrepo/include

  3. Я попытался Git мв общие/включать/общие, но я получаю ту же ошибку

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

ответ

148

Одна из самых приятных вещей о мерзавец, что вам не нужно отслеживать файл переименовывается в явном виде. 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 
# 
+24

Это не работает для меня (с использованием Windows 7, 1.7.6.msysgit.0). Git считает, что старые файлы были удалены и добавлены новые файлы. – Bart

+0

Хм, может быть, git использует некоторую внешнюю утилиту для определения идентичности файла taht не работает в Windows? Это была основная часть реализации git. –

+41

Использование команды 'git mv' - лучший способ сделать это. – Oliver

109
git mv common include 

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

Из git mv man page:

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

In the second form, the last argument has to be an existing directory; the given sources will be moved into this directory.
The index is updated after successful completion, but the change must still be committed.

Нет "git add" должно быть сделано до того ходу.


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

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

Git used to trim the trailing slash, and make the command equivalent to ' git mv file no-such-dir ', which created the file no-such-dir (while the trailing slash explicitly stated that it could only be a directory).

This patch skips the trailing slash removal for the destination path.
The path with its trailing slash is passed to rename(2), which errors out with the appropriate message:

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

Работал отлично - и использование 'git mv' выглядит намного лучше! –

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

Я сожалею, что не хватает репутации комментировать на «ответ» на «Андрес Яан Tack».

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

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

Это может привести к вам не будет видеть мерзавец история вашего проекта в новой папке.

I судимого

$ 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, но без истории (

Сразу хочу предупредить, будьте осторожны, используя советы «Андрес Яан Tack», если вы не хотите потерять GIT hsitory

+0

Убедитесь, что все ваши изменения добавлены. Git терпит неудачу, говоря «плохой источник», если нет никаких изменений, поэтому я только что узнал. –

11

Команда:.

$ git mv oldFolderName newFolderName 

Это, как правило, работает отлично.

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

Решение простое -. Просто совершить перед нанесением git mv

3

Другой способ переместить все файлы. каталог к ​​югу каталог (сохраняет историю мерзавец):

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

6

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

git mv oldFolderName newFoldername 

мерзавец с ошибкой

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

, если есть какие-либо unadded файлы, так что я только что узнал.

+0

«если есть какие-то неадресные файлы, так что я только что узнал». - благодаря! –

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"): Переместите файл в созданную папку

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

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

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

git clean -fd -n 
Смежные вопросы