다른 곳으로 폴더를 이동하는 git 명령 common소스 파일과 폴더가 많은 폴더

common소스 파일과 폴더가 많은 폴더 를 만들었습니다 .

이제 common폴더를 폴더로 옮기고 include싶습니다.include/common

나는 이것을 시도했다 :

  1. git add include

  2. git mv common/ include/

    하지만이 오류로 실패합니다

    치명적 : 잘못된 소스, source = myrepo / common, destination = myrepo / include

  3. 시도 git mv common/ include/common했지만 같은 오류가 발생합니다.

이것을 달성하는 방법에 대한 아이디어가 있습니까?



답변

git의 가장 좋은 점 중 하나는 파일 이름 바꾸기를 명시 적으로 추적 할 필요가 없다는 것입니다. 힘내 파일의 내용을 비교하여 알아낼 것입니다.

따라서 귀하의 경우 그렇게 열심히 일하지 마십시오.

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

러닝 git status은 다음과 같은 것을 보여줄 것입니다 :

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    common/file.txt -> include/common/file.txt
#


답변

 git mv common include

작동해야합니다.

로부터 git mvman 페이지 :

git mv [-f] [-n] [-k] <source> ... <destination directory>

두 번째 형식에서 마지막 인수는 기존 디렉토리 여야합니다. 주어진 소스는이 디렉토리로 이동 합니다.
성공적으로 완료된 후에는 색인이 업데이트되지만 변경 사항은 계속 커밋해야합니다.

이동 하기 전에git add“를 수행 하면 안됩니다 .


참고 : ” git mv A B/B는 디렉토리로 존재하지 않는 경우 오류가 발생하지만 그렇지 않습니다.

Git 1.9 / 2.0 (2014 년 1 분기 )에 대한 Matthieu Moy ( )의 커밋 c57f628 을 참조하십시오 .moy

Git은 후행 슬래시를 자르고 명령을 ‘ git mv file no-such-dir‘ 와 동일하게 만들어 파일을 만들었습니다 no-such-dir(후행 슬래시는 디렉토리 일 수 있다고 명시 적으로 언급 함).

이 패치는 대상 경로의 슬래시 제거를 건너 뜁니다.
끝에 슬래시가있는 경로는 rename (2)로 전달되며, 해당 메시지와 함께 오류가 발생합니다.

$ git mv file no-such-dir/
fatal: renaming 'file' failed: Not a directory


답변

명령:

$ git mv oldFolderName newFolderName

일반적으로 잘 작동합니다.

“bad source …”오류는 일반적으로 마지막 커밋 후에 소스 디렉토리에 일부 이름이 바뀌 었으므로 git mv예상 파일을 찾을 수 없음을 나타냅니다 .

해결책은 적용하기 전에 커밋하는 것 git mv입니다.


답변

실행하기 전에 모든 변경 사항을 스테이징 영역에 추가했는지 확인하십시오.

git mv oldFolderName newFoldername

자식은 오류와 함께 실패

fatal: bad source, source=oldFolderName/somepath/somefile.foo, destination=newFolderName/somepath/somefile.foo

추가되지 않은 파일이 있으면 방금 알았습니다.


답변

디렉토리의 모든 파일을 하위 디렉토리로 옮기는 또 다른 방법 (git history를 유지) :

$ for file in $(ls | grep -v 'subDir'); do git mv $file subDir; done;


답변

git mv한 폴더의 내용을 기존 폴더로 옮기고 싶었던이 “간단한”스크립트로 끝나는 비슷한 문제가있었습니다 .

pushd common; for f in $(git ls-files); do newdir="../include/$(dirname $f)"; mkdir -p $newdir; git mv $f $newdir/$(basename "$f"); done; popd

설명

  • git ls-files: commongit에 체크인 된 모든 파일 ( 폴더 내)을 찾으십시오.
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir;: 폴더 include구조와 동일한 폴더 구조로 폴더 안에 새 폴더를 만듭니다.common
  • git mv $f $newdir/$(basename "$f"): 파일을 새로 만든 폴더로 이동

이 작업을 수행하는 이유는 git이 파일을 기존 폴더로 이동하는 데 문제가있는 것 같고 파일을 존재하지 않는 폴더로 이동하려고하면 실패합니다 (따라서 mkdir -p).

이 방법의 좋은 점은 git에 이미 체크인 된 파일 만진다 는 것입니다 . 단순히 git mv전체 폴더를 이동하는 데 사용 하고 폴더에 준비되지 않은 변경 사항이 포함되어 있으면 git은 수행 할 작업을 알 수 없습니다.

파일을 이동 한 후에 는 저장소정리하여 남아있는 준비되지 않은 변경 사항을 제거 할 수 있습니다. 먼저 건식 실행을 기억하십시오!

git clean -fd -n


답변

“Andres Jaan Tack”의 “답변”을 언급 할만한 명성을 얻지 못해 죄송합니다.

나는 내 메시지가 삭제 될 것이라고 생각한다.

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

새 폴더에 프로젝트의 git history가 표시되지 않을 수 있습니다.

나는 노력했다

$ git mv oldFolderName newFolderName

얻었다

fatal: bad source, source=oldFolderName/somepath/__init__.py, dest
ination=ESWProj_Base/ESWProj_DebugControlsMenu/somepath/__init__.py

내가 했어

git rm -r oldFolderName

git add newFolderName

내 프로젝트에 오래된 자식 기록이 표시되지 않습니다. 적어도 내 프로젝트는 손실되지 않습니다. 이제 newFolderName에 프로젝트가 있지만 기록이 없습니다 (

만약 당신이 git hsitory를 잃고 싶지 않다면, “Andres Jaan Tack”의 조언을 사용하여 조심해서 경고하고 싶다.