Изменение имен файлов в git repo - PullRequest
66 голосов
/ 05 апреля 2011

Как git обрабатывает изменения имени файла?

Будет ли изменение имени файла обнаружено как изменение, или будет "потерянный" файл, который необходимо удалить, а затем добавить новый файл с помощью git add?

Ответы [ 5 ]

86 голосов
/ 05 апреля 2011

Он будет автоматически определен как модификация, и «новый» файл будет добавлен в индекс, поэтому вам нужна только одна команда:

$ git mv application.py newApplication.py
$ git status
# On branch buildServer
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       renamed:    application.py -> newApplication.py

И коммит конечно ..

26 голосов
/ 05 апреля 2011

В каждом коммите git записывает состояние вашего исходного дерева, а не то, было ли переименование (или что-то еще), которое создало это состояние.Таким образом, если вы просто переименуете файл как обычно (а не с помощью git mv), вывод git status будет выглядеть примерно так:

# On branch master
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    foo.txt
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   bar.txt
no changes added to commit (use "git add" and/or "git commit -a")

Если вы затем решите, что хотите записать состояниедерево с переименованным файлом, вы можете установить это изменение с помощью:

 git rm foo.txt
 git add bar.txt

... тогда git status покажет вам:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    foo.txt -> bar.txt

... и вы можете зафиксироватьчто с git commit как обычно:

git commit -m "Renamed foo.txt to bar.txt"

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

8 голосов
/ 06 апреля 2011

Как объясняли предыдущие ответы, Git получает операцию переименования файла из изменения содержимого в вашем исходном дереве.Для записи операции переименования Git сохраняет как операцию удаления, так и добавление, а не саму операцию переименования.

Как Магнус Ског указал git mv <filename1> <filename2> говорит Git добавить содержимое в <filename1> в <filename2> и удалить <filename1> из дерева файлов.

Как Mark Longair объяснил , если вместо git mv вы используете команду оболочки mv <filename1> <filename2>, Git не обнаружит операцию переименования, пока вы не вызовете git rm <filename1> и git add <filename2>.

Однако, другой способ сообщить Git об операциях переименования с mv - использовать git add --all.Эта команда указывает Git обнаружить и подготовить для фиксации все файлы в вашей рабочей области, отличные от тех, которые находятся в репозитории, включая те, которые вы переименовали:

$ ls
a  b  c  d
$ mv d e
$ git status
# On branch master
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    d
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   e
no changes added to commit (use "git add" and/or "git commit -a")
$ git add --all
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    d -> e
#

git add --all - это очень удобный способ фиксациибольшое количество файлов, которые вы переименовали в своем рабочем пространстве, например, с помощью скрипта или инструмента массового переименования.

1 голос
/ 07 апреля 2019

'git mv old_file_name new_file_name'

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

rkalaiselvan@CHN-LAP-RAVICHA MINGW64 ~/Documents/GitHub/project-euler-solutions/python (development)
$ git status
On branch development
Your branch is up to date with 'origin/development'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        problem_2.py

nothing added to commit but untracked files present (use "git add" to track)

rkalaiselvan@CHN-LAP-RAVICHA MINGW64 ~/Documents/GitHub/project-euler-solutions/python (development)
$ git mv problem_1.py multiples_of_3_and_5.py

rkalaiselvan@CHN-LAP-RAVICHA MINGW64 ~/Documents/GitHub/project-euler-solutions/python (development)
$ git status
On branch development
Your branch is up to date with 'origin/development'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    problem_1.py -> multiples_of_3_and_5.py

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        problem_2.py
1 голос
/ 05 апреля 2011

git mv

Сохраняет историю и перемещает файл.Необходимо выполнить коммит впоследствии, чтобы репо было обновлено.

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

Он также перемещает файл в файловой системе (это можно переопределить).Так что нет необходимости делать git add

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...