[git] 자식 mv와 디렉토리의 경우 만 변경

비슷한 질문 을했지만 내 문제에 대한 답을 찾지 못했습니다

내가 디렉토리를 FOO에서 foo로 바꾸려고 git mv FOO foo하면

fatal: renaming 'FOO' failed: Invalid argument

확인. 그래서 시도합니다git mv FOO foo2 && git mv foo2 foo

그러나 내가 통해 커밋하려고 git commit .하면

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
# foo
nothing added to commit but untracked files present (use "git add" to track)

git add foo아무것도 변경하지 않고 디렉토리를 추가하면 git commit .동일한 메시지가 다시 나타납니다.

내가 뭘 잘못하고 있죠? 대소 문자 구분 시스템 (OSX)을 사용하고 있다고 생각했는데 왜 단순히 디렉토리 이름을 바꿀 수 없습니까?



답변

대소 문자를 구분하지 않는 환경에 있습니다. 또한 Git이 이해 -A하는 mv것처럼 제거 기능을 추가 하지 않아도 제거 측면을 처리하지 않습니다 . 경고! 이 작업을 수행 할 때 다른 변경 사항이나 추적되지 않은 파일이 없는지 확인하십시오. 그렇지 않으면이 변경 사항의 일부로 커밋됩니다. git stash -u먼저이 작업을 수행 한 다음 수행하십시오 git stash pop. 계속 :이 문제를 해결하려면 다음을 수행하십시오.

mv foo foo2
git add -A
git commit -m "renaming"
mv foo2 FOO
git add -A
git commit --amend -m "renamed foo to FOO"

이것이 작업 디렉토리를 변경하고 커밋 한 다음 두 커밋을 축소하는 방법입니다. 인덱스에서 파일을 옮길 수는 있지만 git을 처음 접하는 사람에게는 무슨 일이 일어나고 있는지 명확하지 않을 수 있습니다. 더 짧은 버전은

git mv foo foo2
git mv foo2 FOO
git commit -m "changed case of dir"

의견 중 하나에서 제안한 것처럼 대화 형 리베이스 ( git rebase -i HEAD~5잘못된 커밋이 5 커밋 전에 도입 된 경우)를 수행하여 사례를 수정하고 히스토리의 어느 곳에도 잘못된 케이스가 나타나지 않도록 할 수 있습니다. 커밋 해시가 다르고 다른 사람들이 최근의 지사와 함께 작업을 리베이스하거나 다시 병합해야하기 때문에이 작업을 수행하면주의해야합니다.

이것은 파일 이름 수정과 관련이 있습니다 : git은 대소 문자를 구분하지 않습니까?


답변

옵션 core.ignorecase을 false 로 설정하려고 하면 Git이 기본적으로 지원하지 않는 파일 시스템의 경우에주의를 기울입니다. 리포지토리에서 활성화하려면 :

$ git config core.ignorecase false

그런 다음 파일 이름을 바꿀 수 git mv있으며 예상대로 작동합니다.


답변

임시 파일 이름을 사용하여 git 1.7.7을 사용 하여이 문제를 해결할 수있었습니다.

$ git mv improper_Case improve_case2
$ git mv improve_case2 improve_case
$ git commit -m "<your message>"


답변

( git mv무료 변형)

Mac OS X 10.9의 Git 에서이 문제가 발생했습니다. 나는 다음과 같이 해결했다.

git rm -r --cached /path/to/directory

Git에서 삭제할 디렉토리를 준비하지만 실제로 실제 파일을 제거하지는 않습니다 ( --cached). 또한 적절한 경우 디렉토리가 추적되지 않은 파일에 표시됩니다.

그래서 당신은 이것을 할 수 있습니다 :

mv /path/to/directory /path/to/DIRECTORY
git add -A /path/to/DIRECTORY

그런 다음 Git은 파일 이름을 변경했음을 인식 git status하고 여러 renamed:줄을 보게 됩니다. 그것들을 검사하고 그것들이 올바르게 보이는지 확인하고, 그렇다면 정상적으로 변경 사항을 커밋 할 수 있습니다.


답변

빠르고 안전합니다.

git mv -f path/to/foo/* path/to/FOO/

경고! 이름이 바뀐 폴더에있는 모든 파일의 이름을 항상 바꿉니다 (사용 /*).

단일 파일의 이름을 바꾸지 마십시오. 이것은이 답변에 설명 된 버그로 이어집니다 .

먼저 결과를 먼저 보려면 다음을 사용하십시오 -n.

git mv -f -n path/to/foo/* path/to/FOO/

당신이 만든 후 mv:

  1. 커밋 변경
  2. 다른 개정에 대한 체크 아웃
  3. 다시 확인하십시오.

이제 Git은 내부 파일과 파일 시스템에서 BOTH 폴더의 이름을 변경해야합니다.


답변

-f 옵션으로 강제 실행하십시오.

git mv -f FOO foo


답변

하나의 관련 문제가있었습니다.

하나의 폴더는 ‘Pro'(처음 생성됨)이고 다른 하나는 ‘pro'(실수로 생성됨)입니다. Mac에서는 똑같지 만 git에 따라 다릅니다.

$ git config core.ignorecase false

git config는 파일의 이름을 오른쪽 폴더 (감사)로 바꾸고 ‘pro'(No !!)에 고스트 파일을 만들었습니다. 나는 고스트 파일 변경 사항을 트랙에 추가 할 수 없었고 그 파일을 나와 함께 가지고 다니지 않으면 다른 지점을 체크 아웃 할 수 없었으며 어떻게 든 재설정 할 수 없었습니다.

그 대신에, 나는했다

$ git rm -r --cached pro
$ git status // => pro files removed, new Pro files untracked
$ git add Pro

추가 안전을 위해 별도의 수정 지점에서 수행 한 다음 기본 지점으로 다시 병합했습니다.

님이 만든 고스트 파일 문제에 대해 전문가가 방법과 이유를 설명 할 수 있습니까? 미리 감사드립니다.