Development Tip

커밋 내역과 함께 파일 및 디렉토리를 하위 디렉토리로 이동

yourdevel 2020. 11. 14. 11:13
반응형

커밋 내역과 함께 파일 및 디렉토리를 하위 디렉토리로 이동


커밋 내역과 함께 디렉토리와 파일을 하위 디렉토리로 이동하려면 어떻게해야합니까?

예를 들면 :

  • 소스 디렉토리 구조 : [project]/x/[files & sub-dirs]

  • 대상 디렉토리 구조 : [project]/x/p/q/[files & sub-dirs]


bmargulies주석에 추가하려면 전체 시퀀스는 다음과 같습니다.

mkdir -p x/p/q      # make sure the parent directories exist first
git mv x/* x/p/q    # move folder, with history preserved
git commit -m "changed the foldername x into x/p/q"

먼저 이동 미리보기를 확인하세요.

git mv -n x/* x/p/q

볼프강 의견 :

당신이 떠들썩한 파티를 사용하는 경우, 당신은 확장 글로브를 사용하여 같은 의해 자체에 폴더를 이동하려고 문제 방지 할 수 있습니다 (사용을 내장 ) :shopt

shopt -s extglob; git mv !(folder) folder

캡틴 맨 은 다음을 수행해야하는 의견에 대해 보고합니다 .

mkdir temp 
git mv x/* temp
mkdir -p x/p/q
git mv temp x/p/q
rmdir temp;

문맥:

Cygwin과 함께 Windows를 사용하고 있습니다.
나는 shopt -s extglob예제가 잘못되어 내 방식이 필요하지 않을 수도 있음을 깨달았 지만 일반적으로 bash 대신 zsh를 사용하고 명령이 없었습니다 shopt -s extglob(대안이 있다고 확신하지만), 그래서이 접근법 쉘에서 작동한다 (쉘의에서 하도 mkdirrmdir는 특히 외국인 인 경우)


대안으로, 팽키는 언급 코멘트에 -k의 옵션git mv :

오류 상태로 이어질 수있는 이동 또는 이름 바꾸기 작업을 건너 뜁니다.

git mv -k * target/

" can not move directory into itself"오류를 피할 수 있습니다.


힘내 그래서, 그 주위에 이동하는 경우에도 컨텐츠를 추적 할 수있는 아주 좋은 일을 git mv명확하게 파일을 이동하는 경우가에 속하는 사용하기 때문에 길을 가야하는 것입니다 x,하지만 지금은에 속한 x/p/q프로젝트가 그런 식으로 진화하기 때문이다.

그러나 때로는 프로젝트 기록 전체에서 파일을 하위 디렉토리로 이동해야하는 이유가 있습니다. 예를 들어 파일이 실수로 어딘가에 저장되고 그 이후로 더 많은 커밋이 이루어졌지만 간헐적 인 커밋이 잘못된 위치에있는 파일에 대해 이해가되지 않는 경우입니다. 로컬 브랜치에서 일어난 모든 일이 밀기 전에 엉망진창을 정리하고 싶습니다.

이 질문은 "커밋 히스토리와 함께"라고 말하는데, 내가 정확히 그런 방식으로 히스토리를 다시 쓰는 것으로 해석 할 것입니다. 이것은 다음과 같이 할 수 있습니다.

git filter-branch --tree-filter "cd x; mkdir -p p/q; mv [files & sub-dirs] p/q" HEAD

그러면 파일 p/q이 기록 전체에 걸쳐 하위 디렉토리에 나타납니다 .

재 작성이 이전에 이미 푸시 된 커밋을 건 드리면 결과를 공용 서버로 푸시해서는 안됩니다.


나는 이것이 오래된 질문이라는 것을 알 수 있지만 여전히 git book 의 예제 중 하나에서 파생 된 문제에 대한 현재 솔루션으로 대답해야 할 의무가 있다고 느낍니다 . 비효율적 인 --tree-filter것을 사용하는 대신 --index-filter.

git filter-branch -f --index-filter 'PATHS=`git ls-files -s | sed "s/^<old_location>/<new_location>/"`;GIT_INDEX_FILE=$GIT_INDEX_FILE.new; echo -n "$PATHS" | git update-index --index-info && if [ -e "$GIT_INDEX_FILE.new" ]; then mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"; fi' -- --all

이것은 한 가지 특별한 경우에 커밋 기록의 파일 이름을 대량으로 변경하기 위해 동일한 예제를 사용한 책의 예제 중 하나의 전문화입니다. 하위 디렉토리에서 파일을 이동하는 경우 : sed 명령이 예상대로 작동하도록하려면 경로에서 / 문자를 \로 이스케이프해야합니다.

예:

Project Directory
                 |-a
                 |  |-a1.txt
                 |  |-b
                 |  |  |-b1.txt

to move the b directory to the project root:

git filter-branch -f --index-filter 'PATHS=`git ls-files -s | sed "s/a\/b\//b\//"`;GIT_INDEX_FILE=$GIT_INDEX_FILE.new; echo -n "$PATHS" | git update-index --index-info && if [ -e "$GIT_INDEX_FILE.new" ]; then mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"; fi' -- --all

Result:

Project Directory
                 |-a
                 |  |-a1.txt
                 |
                 |-b
                 |  |-b1.txt

The git mv command is the simplest way. However, at least on my Linux box, I needed to supply the -k flag to avoid getting an error back that a folder cannot be moved into itself. I was able to perform the action by using...

mkdir subdirectory
git mv -k ./* ./subdirectory
# check to make sure everything moved (see below)
git commit

As a warning, this will skip all moves which would lead to an error condition, so you will probably want to check that everything worked properly after the move and before a commit.

참고URL : https://stackoverflow.com/questions/18667308/move-file-and-directory-into-a-sub-directory-along-with-commit-history

반응형