Git - будут ли обнаружены перемещения файла? - PullRequest
3 голосов
/ 17 января 2011

Я выполнил некоторые модификации на ветке (А).

Затем я решил создать совершенно новую ветвь (B), основанную на состоянии моей существующей рабочей копии, зафиксировать и нажать на нее.

Было несколько файлов, которые были перемещены во время моего предыдущего рефакторинга, и, следовательно, теперь не были включены в систему контроля версий, поскольку были перемещены непосредственно в файловую систему. Случайно я не добавил эти файлы в git перед фиксацией и отправкой в ​​новую ветку (B).

Если я сейчас добавлю эти файлы, зафиксирую и отправлю, сможет ли Git обнаружить операции перемещения файла?

Ответы [ 4 ]

5 голосов
/ 17 января 2011

Нет, если они сделаны как две отдельные фиксации, потому что файлы будут удалены в одной ревизии, а новый файл будет создан в новой ревизии. Если вы хотите сохранить переименование, вы должны сделать git commit --amend, чтобы добавить свои добавления к предыдущему коммиту с удалениями.

3 голосов
/ 17 января 2011

Движение будет обнаружено, если вы сделаете прямое сравнение до и после ревизии, но не при просмотре обычного git log:

[bd@satoko testgit] echo hello world > foo
[bd@satoko testgit] git init
gitInitialized empty Git repository in /home/bd/testgit/.git/
[bd@satoko testgit] git add foo
[bd@satoko testgit] git commit -m 'test'
[master (root-commit) 772dbe5] test
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 foo
[bd@satoko testgit] mv foo bar
[bd@satoko testgit] echo baz > quux
[bd@satoko testgit] git add quux
[bd@satoko testgit] git commit -a -m 'rm; add'
[master 59dd10b] rm; add
 2 files changed, 1 insertions(+), 1 deletions(-)
 delete mode 100644 foo
 create mode 100644 quux
[bd@satoko testgit] git add bar
[bd@satoko testgit] git commit -m 'add'
[master 823f70f] add
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 bar

[bd@satoko testgit] git log --stat -m
commit 823f70fe50828204686a6a42a5e98dc9b258903b
Author: Bryan Donlan <bdonlan@fushizen.net>
Date:   Mon Jan 17 05:06:16 2011 -0500

    add

 bar |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

commit 59dd10bfb72bb9005edecb1b7609978d82d21652
Author: Bryan Donlan <bdonlan@fushizen.net>
Date:   Mon Jan 17 05:05:58 2011 -0500

    rm; add

 foo  |    1 -
 quux |    1 +
 2 files changed, 1 insertions(+), 1 deletions(-)

commit 772dbe5357253b533f8f2b9c64836dc09a51def4
Author: Bryan Donlan <bdonlan@fushizen.net>
Date:   Mon Jan 17 05:04:35 2011 -0500

    test

 foo |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
### As you can see, a log doesn't show the move, but...
[bd@satoko testgit] git diff --stat  823f..772d -M
 bar => foo |    0
 quux       |    1 -
 2 files changed, 0 insertions(+), 1 deletions(-)
### A direct comparison does

Это происходит потому, что git фактически не сохраняет ход/ переименовать информацию - она ​​восстанавливает ее, сравнивая содержимое добавленных / удаленных файлов.При прямом сравнении он смотрит только на состояние до / после, поэтому не имеет значения, как именно были добавлены / удалены файлы.Однако при git log он сравнивает парные версии, поэтому он видит только «удаленные» или «добавленные», а не оба.

Если это проблема, вы можете рассмотреть возможность использования git rebase --interactive, чтобы объединить добавление файлов обратно в ревизию, которая их удалила.Однако это может иметь нежелательные побочные эффекты , если изменения с плохой историей уже были загружены другими.

0 голосов
/ 17 января 2011

Учитывая, что Git не хранит никакой информации о переименовании, а скорее запускает какой-то механизм обнаружения переименования, у вас все будет в порядке. См. Также Обработка переименований: svn vs. git vs. mercurial

0 голосов
/ 17 января 2011

Но git обрабатывает объекты по содержимому, а не по путям. Это означает, что не имеет значения, когда вы перемещаете объект (файл) или удаляете / добавляете объект. Он будет храниться только один раз в базе данных git repo.

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