Как правильно переименовать каталог в репозитории Git?

655

Я думаю, что это должно работать, чтобы скопировать каталог, который будет переименован в новый каталог с нужным именем, и удалить старый каталог , и git add, git commitи pushвсе. Но так ли это лучше?

qazwsx
источник
1
Возможный дубликат: Как сказать Git, что это тот же каталог, только другое имя
Кристофер Пайзерт
5
Что касается Git, копирование и удаление - это то же самое, что и перемещение. Git запишет и (копировать + удалить) и (переместить) одинаково.
Дитрих Эпп

Ответы:

1183

Основное переименование (или перемещение):

git mv <old name> <new name>

Переименование с учетом регистра, например от casesensitiveдо CaseSensitive- вы должны использовать два шага:

git mv casesensitive tmp
git mv tmp CaseSensitive

( Подробнее о чувствительности к регистру в Git… )

… Сопровождаемый коммитом и push - самый простой способ переименовать каталог в git-репо.

CB Bailey
источник
231
Но если вы хотите переименовать из casesensitiveв CaseSensitive, вы можете сделать это следующим образом: git mv casesensitive Tempа затем git mv Temp CaseSensitive
ViliusK
3
Сохраняет ли он весь журнал и статистику?
orezvani
23
@ ViliusK, если вы имеете дело с каталогами, чувствительными к регистру, любой простой способ, который я нашел, - это git rm -rf --cached path/to/your/directoriesдобавить и зафиксировать
заново
1
Но почему GIT не имеет надлежащей поддержки для изменения имени для пакета / каталога? Зачем мне вообще нужно создавать отдельную папку. Когда я меняю имя пакета, не должно ли оно восприниматься как различие и заботиться об этом во время commit & push?
Ахмед
1
Большое спасибо за это. Для меня я должен был сначала выполнить git config core.ignorecase falseи затем выполнить команды последовательно или иначе, для второй части я получил бы source is emptyошибку.
Рика
107

Если вы получили эту ошибку: fatal: переименование 'foldername' не выполнено: неверный аргумент

Попробуй это:

git mv foldername tempname && git mv tempname folderName

Жак Бетанкур
источник
8
Это именно то, что мне нужно, чтобы изменить регистр в каталоге.
cjserio
Маркер '&&' не является допустимым разделителем операторов в этой версии. git версия 2.11.0.windows.
Тим Харди
@Tim Hardy также может быть запущен как две отдельные команды, git mv foldername tempnameи git mv tempname folderName, которые должны работать в Windows.
Larkeith
это не работает ! конечный результат поместит новую папку 'folderName' в папку 'tempname'
ставка
61

1. Измените имя папки со старой папки на новую

git mv oldfolder newfolder

2. Если новая папка уже есть в вашем хранилище и вы хотите переопределить ее и использовать: - force

git mv -f oldfolder newfolder

Не забудьте добавить изменения в индекс и зафиксировать их после переименования с помощью git mv.

3. Переименование foldername в folderName в нечувствительных к регистру файловых системах.

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

git mv foldername folderName

Если вы используете нечувствительную к регистру файловую систему, например, у вас Mac, и вы не настроили ее для учета регистра, вы увидите сообщение об ошибке, подобное следующему:

роковое: переименование «имя_фолдера» не удалось: неверный аргумент

И вот что вы можете сделать, чтобы заставить его работать: -

git mv foldername tempname && git mv tempname folderName

Это разделяет процесс переименования, сначала переименовывая папку в совершенно другое имя. После переименования в другое имя папки папка может быть наконец переименована в новое имя папки. После этих git mv, опять же, не забудьте добавить и зафиксировать изменения. Хотя это, вероятно, не красивая техника, она прекрасно работает. Файловая система по-прежнему не распознает изменения букв, но git делает это из-за переименования в новое имя, и это все, что мы хотели :)

akshay_rahar
источник
9

Вы можете переименовать каталог, используя файловую систему. Тогда вы можете сделать git rm <old directory>и git add <new directory>( страница справки ). Тогда вы можете совершить и нажать.

Git обнаружит, что содержимое одинаково и что это просто операция переименования, и она появится как запись переименования в истории. Вы можете проверить, что это так, перед фиксацией, используяgit status

Oleksi
источник
12
эй, но так я потеряю всю историю коммитов.
ViliusK
1
Вы можете сохранить его, если используете флаг -follow.
Олекси
Две команды вместо одной, и нужно добавить флаг? Это лучше, чем git mv?
Antgel
4
@topper Нет, git mv - это просто псевдоним для rm + add. Использование git mv - лучшее решение.
Олекси
5
@topper Обратите внимание, что вам все равно придется использовать --follow для просмотра истории независимо от того, какой метод вы используете для перемещения файла.
Олекси
3

Из веб-приложения я думаю, что вы не можете, но вы можете переименовать все папки в Git Client, он переместит ваши файлы в новые переименованные папки, чем зафиксировать и отправить в удаленный репозиторий.

У меня была очень похожая проблема: мне приходилось переименовывать разные папки из прописных в строчные (например, Abc -> abc), я переименовал все папки с фиктивным именем (например, «abc___») и затем зафиксировал их в удаленном репозитории после что я переименовал все папки в исходное имя строчными буквами (например, abc), и он взял их!

Syncro
источник
0

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

Шаг 1: Переименуйте папку (с учетом регистра) во что-то еще из проводника. например, Переименовать с учетом регистра в folder1 зафиксировать это изменение.

Шаг 2: Переименуйте эту недавно названную папку (folder1) в ожидаемое регистрозависимое имя (Casesensitive), например. Переименуйте folder1 в Casesensitive. Передайте это изменение.

Nilesh
источник
0

Для переименования с учетом регистра, git mv somefolder someFolderработал для меня раньше, но не сегодня по какой-то причине. В качестве обходного пути я создал новую папку temp, переместил все содержимое somefolderв temp, удалил somefolder, зафиксировал temp, затем создал someFolder, переместил все содержимое tempв someFolder, удалил temp, зафиксировал и отправил, someFolderи это сработало! Появляется как someFolderв Git.

Райан Уокер
источник
-16

Просто переименуйте папку. git - это «контент-трекер», поэтому хэши SHA1 такие же, и git знает, что вы его переименуете. Единственное, что меняется, это дерево-объект.

rm <directory>
git add .
git commit
bitwave
источник
1
Это не всегда работает. Это точно не сработало для меня. как 20% файлов ...
Томаш Фейфар