Как сделать так, чтобы git пометил удаленный и новый файл как файл перемещенный?

Также проверьте include-what-you-use , который решает подобную проблему.

424
задан pupeno 11 January 2009 в 16:01
поделиться

5 ответов

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

дополнительно, для перемещает каталоги, Вы, возможно, должны:

  1. CD к вершине той структуры каталогов.
  2. Выполнение git add -A .
  3. Выполнение git status, чтобы проверить, что "новый файл" является теперь "переименованным" файлом

, Если состояние мерзавца все еще показывает "новый файл" и не "переименовало" Вас, должно следовать совет Gay’s Мотка и сделать перемещение и изменить в двух отдельных фиксациях.

386
ответ дан Community 12 January 2009 в 02:01
поделиться
  • 1
    мистифицируйте: Вы могли разделить код зеркально отраженного пространства на метод и/или использовать gstate, чтобы сохранить и восстановить зеркальное отражение, но видеть другой ответ я просто отправил. – Peter Hosey 24 April 2010 в 09:09

Это - весь перцептивная вещь. Мерзавец обычно довольно хорош в распознавании перемещений, потому что МЕРЗАВЕЦ средство отслеживания содержания

Все, что действительно зависит, то, как Ваша "статистика" отображает его. Единственной разницей здесь является флаг-M.

журнал мерзавца - журнал мерзавца-M

commit 9c034a76d394352134ee2f4ede8a209ebec96288
Author: Kent Fredric
Date:   Fri Jan 9 22:13:51 2009 +1300


        Category Restructure

     lib/Gentoo/Repository.pm                |   10 +++++-----
     lib/Gentoo/{ => Repository}/Base.pm     |    2 +-
     lib/Gentoo/{ => Repository}/Category.pm |   12 ++++++------
     lib/Gentoo/{ => Repository}/Package.pm  |   10 +++++-----
     lib/Gentoo/{ => Repository}/Types.pm    |   10 +++++-----
     5 files changed, 22 insertions(+), 22 deletions(-)

статистики - статистика

commit 9c034a76d394352134ee2f4ede8a209ebec96288
Author: Kent Fredric
Date:   Fri Jan 9 22:13:51 2009 +1300

    Category Restructure

 lib/Gentoo/Base.pm                |   36 ------------------------
 lib/Gentoo/Category.pm            |   51 ----------------------------------
 lib/Gentoo/Package.pm             |   41 ---------------------------
 lib/Gentoo/Repository.pm          |   10 +++---
 lib/Gentoo/Repository/Base.pm     |   36 ++++++++++++++++++++++++
 lib/Gentoo/Repository/Category.pm |   51 ++++++++++++++++++++++++++++++++++
 lib/Gentoo/Repository/Package.pm  |   41 +++++++++++++++++++++++++++
 lib/Gentoo/Repository/Types.pm    |   55 +++++++++++++++++++++++++++++++++++++
 lib/Gentoo/Types.pm               |   55 -------------------------------------
 9 files changed, 188 insertions(+), 188 deletions(-)

журнал справки мерзавца

   -M
       Detect renames.

   -C
       Detect copies as well as renames. See also --find-copies-harder.
44
ответ дан cpburnz 12 January 2009 в 02:01
поделиться

git diff -M или git log -M должен автоматически обнаружить такие изменения как переименовывают с незначительными изменениями , пока они действительно. Если Ваш незначительные изменения не незначительны, можно уменьшить подобие threashold, например,

$ git log -M20 -p --stat

для сокращения его от значения по умолчанию 50% к 20%.

31
ответ дан Simon East 12 January 2009 в 02:01
поделиться

Сделайте перемещение и изменение в отдельных фиксациях.

93
ответ дан Hank Gay 12 January 2009 в 02:01
поделиться

Вот быстрое и грязное решение для одного или нескольких переименованных и измененных файлов, которые не были зафиксированы.

Допустим, файл был назван foo , и теперь он с именем bar :

  1. Переименовать bar в временное имя:

     mv bar side
    
  2. Оформить заказ foo :

     git checkout HEAD foo
    
  3. Переименуйте foo в bar с помощью Git:

     git mv foo bar
    
  4. Теперь переименуйте временный файл обратно в bar .

     mv side bar
    

Этот последний шаг возвращает ваше измененное содержимое обратно в файл.

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

$ git status
On branch workit
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   .gitignore
    renamed:    README -> README.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   README.md
    modified:   work.js

$ git add README.md work.js # why are the changes unstaged, let's add them.
$ git status
On branch workit
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   .gitignore
    deleted:    README
    new file:   README.md
    modified:   work.js

$ git stash # what? let's go back a bit
Saved working directory and index state WIP on dir: f7a8685 update
HEAD is now at f7a8685 update
$ git status
On branch workit
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .idea/

nothing added to commit but untracked files present (use "git add" to track)
$ git stash pop
Removing README
On branch workit
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   .gitignore
    new file:   README.md

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    deleted:    README
    modified:   work.js

Dropped refs/stash@{0} (1ebca3b02e454a400b9fb834ed473c912a00cd2f)
$ git add work.js
$ git status
On branch workit
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   .gitignore
    new file:   README.md
    modified:   work.js

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    deleted:    README

$ git add README # hang on, I want it removed
$ git status
On branch workit
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   .gitignore
    deleted:    README
    new file:   README.md
    modified:   work.js

$ mv README.md Rmd # Still? Try the answer I found.
$ git checkout README
error: pathspec 'README' did not match any file(s) known to git.
$ git checkout HEAD README # Ok the answer needed fixing.
$ git status
On branch workit
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   .gitignore
    new file:   README.md
    modified:   work.js

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    deleted:    README.md
    modified:   work.js

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

    Rmd

$ git mv README README.md
$ git status
On branch workit
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   .gitignore
    renamed:    README -> README.md
    modified:   work.js

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   work.js

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

    Rmd

$ mv Rmd README.md
$ git status
On branch workit
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   .gitignore
    renamed:    README -> README.md
    modified:   work.js

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   README.md
    modified:   work.js

$ # actually that's half of what I wanted; \
  # and the js being modified twice? Git prefers it in this case.
31
ответ дан 22 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: