programing

git 마크를 삭제한 파일과 새로운 파일을 파일 이동으로 만드는 방법

lovejava 2023. 4. 14. 20:53

git 마크를 삭제한 파일과 새로운 파일을 파일 이동으로 만드는 방법

파일을 수동으로 옮긴 후 수정했습니다.Git에 따르면 새로운 파일과 삭제된 파일이라고 합니다.Git을 파일 이동으로 취급할 수 있는 방법이 있습니까?

수정이 심하지 않으면 Git은 자동으로 이동/이름 변경을 감지합니다. ★★★★★★★★★★★★★★★★★.git add및 " " " 입니다.git rm오래된 파일 git status그러면 이름 변경이 검출되었는지 여부가 표시됩니다.

또, 디렉토리를 이동하려면 , 다음의 조작을 실시할 필요가 있습니다.

  1. cd를 해당 디렉토리 구조의 맨 위에 배치합니다.
  2. 실행합니다.git add -A .
  3. 실행합니다.git status file file"이 "new file"이 합니다.

git 상태에 "new file"이 표시되고 "rename"이 표시되지 않으면 Hank Gay의 조언에 따라 이동 및 변경을 두 개의 개별 커밋으로 수행해야 합니다.

이동과 변경을 별도의 커밋으로 수행합니다.

git diff -M ★★★★★★★★★★★★★★★★★」git log -M는 이름 변경과 같은 변경이 실제로 존재하는 한 사소한 변경도 자동으로 검출해야 합니다.경미한 변경이 없는 경우는, 예를 들면, 유사도를 줄일 수 있습니다.

$ git log -M20 -p --stat

기본 50%에서 20%로 줄입니다.

모두 지각에 의한 것입니다.Git은 콘텐츠 트래커이기 때문에 일반적으로 움직임을 인식하는 데 능숙하다.

"상태"가 어떻게 표시하느냐에 따라 달라집니다.여기서 유일한 차이점은 -M 플래그입니다.

git log --stat -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(-)

git log --stat

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.

다음은 커밋되지 않은 이름 변경 및 수정된 파일 하나 또는 몇 개에 대한 빠르고 더러운 솔루션입니다.

예를 들어 파일 이름이라고 합시다.foo그리고 지금은 이름이 붙여졌다.bar:

  1. " " " " "bar시시: :

    mv bar side
    
  2. ★★★★★★foo:

    git checkout HEAD foo
    
  3. " " " " "foo로로 합니다.barGit 함::

    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.

아니면 이 질문에 대한 답을 앰버에게 받아보세요!다시 인용하자면:

먼저 수동으로 이동한 파일의 단계별 추가를 취소합니다.

$ git reset path/to/newfile
$ mv path/to/newfile path/to/oldfile

그런 다음 Git을 사용하여 파일을 이동합니다.

$ git mv path/to/oldfile path/to/newfile

물론 이미 수동 이동을 실행했다면 이동 전 리비전으로 리셋하고 거기서 mv를 얻을 수도 있습니다.

에 대해서git status 말고, 해 보세요. 시도해 보십시오.git commit --dry-run -a 대신에

TortoiseGit을 사용하는 경우 Git의 자동 이름 변경 감지가 커밋 중에 발생한다는 점을 유념해야 합니다. 그러나 이러한 사실이 소프트웨어에서 항상 사전에 표시되는 것은 아닙니다.두 개의 파일을 다른 디렉토리로 옮기고 약간의 편집을 수행했습니다.TortoiseGit을 커밋 도구로 사용하고 있으며, Changes made list에는 파일이 이동되지 않고 삭제 및 추가되어 있습니다.명령줄에서 git 상태를 실행해도 비슷한 상황이 나타납니다.그러나 파일을 커밋한 후 로그에는 이름이 변경된 것으로 표시됩니다.그래서 당신의 질문에 대한 답은 당신이 너무 극단적인 행동을 하지 않는 한 Git은 자동으로 이름을 바꿔야 한다는 것입니다.

편집: 새 파일을 추가한 후 명령줄에서 git 상태를 실행하면 커밋 전에 이름 변경이 나타납니다.

편집 2: 또한 TortoiseGit에서 커밋 대화 상자에 새 파일을 추가하지만 커밋하지 마십시오.다음으로 Show Log 명령어로 이동하여 작업 디렉토리를 보면 Git이 커밋하기 전에 이름을 검출했는지 여부를 확인할 수 있습니다.

같은 질문이 여기서 제기되었다: https://tortoisegit.org/issue/1389 및 수정해야 할 버그로 기록되었다: https://tortoisegit.org/issue/1440 TortoiseGit의 커밋 대화상자에 표시상의 문제가 있는 것으로 판명되었으며, 새로운 파일을 추가하지 않은 경우 git 상태에도 어느 정도 존재합니다.

git mv명령어를 사용하여 파일을 이동할 수 있습니다.https://git-scm.com/docs/git-mv

해 주세요.git mvGit 1.8.5입니다.따라서 이 명령을 사용하려면 Git을 업데이트해야 할 수 있습니다.

'하다'라고 할 수 .git add NEW && git rm OLD를 위해서입니다.

작업 경우는, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」를 참조해 주세요.add+rm접근 방식은 인덱스에 수정을 추가하며, 이는 일부 경우에 바람직하지 않을 수 있다(예: 상당한 수정의 경우 Git은 파일 이름 변경이라는 것을 더 이상 인식하지 못할 수 있다).

인덱스에 이름을 추가하지만 수정 내용은 추가하지 않는다고 가정합니다.이를 실현하는 확실한 방법은 앞뒤로 이름을 바꾸는 것입니다.mv NEW OLD && git mv OLD NEW.

그러나 작업 트리의 파일 이름을 바꾸지 않고 인덱스에서 직접 이 작업을 수행하는(약간 더 복잡한) 방법도 있습니다.

info=$(git ls-files -s -- "OLD" | cut -d' ' -f-2 | tr ' ' ,)
git update-index --add --cacheinfo "$info,NEW" &&
  git rm --cached "$old"

이것은, 에일리어스로도 사용할 수 있습니다.~/.gitconfig:

[alias]
    mv-index = "!f() { \
      old=\"$1\"; \
      new=\"$2\"; \
      info=$(git ls-files -s -- \"$old\" | cut -d' ' -f-2 | tr ' ' ,); \
      git update-index --add --cacheinfo \"$info,$new\" && \
      git rm --cached \"$old\"; \
    }; f"

최근 일부 파일을 이동(수정하지 않음)할 때 이 문제가 발생했습니다.

문제는 파일을 이동했을 때 Git이 행의 끝부분을 변경해서 파일이 같은지 알 수 없었다는 것입니다.

사용.git mv문제를 해결했지만 단일 파일/디렉토리에서만 작동하며 저장소 루트에 많은 파일을 저장해야 했습니다.

이 문제를 해결하는 한 가지 방법은 bash/batch magic을 사용하는 것입니다.

또 다른 방법은 다음과 같습니다.

  • 파일 이동 및git commit이 조작에 의해, 행의 말미가 갱신됩니다.
  • 파일을 원래 위치로 되돌립니다.새로운 행의 엔딩이 생겼기 때문에,git commit --amend
  • 파일을 다시 이동하고git commit --amend이번에는 줄바꿈이 없기 때문에 Git은 기뻐하고 있습니다.

저는 모든 변경 사항을 커밋 전에 저장하고 다시 꺼내는 데 성공했습니다.이를 통해 git은 추가/삭제된 파일을 다시 분석하여 올바르게 이동된 것으로 표시하였습니다.

이를 위한 더 나은 "명령줄" 방법이 있을 것입니다. 그리고 이것이 해킹이라는 것을 알지만, 저는 지금까지 좋은 해결책을 찾지 못했습니다.

거북이 사용GIT: 일부 파일 이동 작업이 이름이 아닌 추가/삭제 로드로 표시되는 GIT 커밋이 있는 경우, 파일의 변경 내용이 작더라도 다음과 같이 하십시오.

  1. 로컬에서 수행한 작업을 체크인합니다.
  2. 두 번째 커밋에서 작은 한 줄 변경 확인
  3. 거북이의 GIT 로그로 이동
  4. 두 개의 커밋을 선택하고 오른쪽 버튼을 클릭한 후 "하나의 커밋에 병합"을 선택합니다.

이제 새로운 커밋에 파일 이름이 올바르게 표시되므로 파일 이력을 올바르게 유지할 수 있습니다.

제가 이 질문을 이해하는 방법은 "오래된 파일의 삭제와 새로운 파일의 작성을 파일 이동으로 git이 인식하게 하는 방법"입니다.

오래된 파일을 삭제하고 오래된 파일을 삽입하면 작업 디렉토리에서 사용할 수 있습니다.git status라고 말할 것이다.deleted: old_file" 및 "Untracked files: ... new_file"

그러나 스테이징 인덱스/레벨에서는 git을 사용하여 파일을 추가 및 삭제하면 파일 이동으로 인식됩니다.이를 수행하려면 운영 체제를 사용하여 삭제 및 생성을 수행했다고 가정하고 다음 명령을 입력합니다.

git add new_file
git rm old_file

" " " " 50% " 를 합니다.git status명령어는 다음 정보를 제공합니다.

renamed: old_file -> new_file

파일을 편집, 이름 변경 및 동시에 이동해도 이러한 해결 방법은 작동하지 않습니다.2개의 및 변경/과 그 다음 의 커밋('2'/')으로입니다.fixup'2'를 통한 두 git rebase -i네, 이렇게요.

언급URL : https://stackoverflow.com/questions/433111/how-to-make-git-mark-a-deleted-and-a-new-file-as-a-file-move