커밋 내역과 함께 파일 및 디렉토리를 하위 디렉토리로 이동
커밋 내역과 함께 디렉토리와 파일을 하위 디렉토리로 이동하려면 어떻게해야합니까?
예를 들면 :
소스 디렉토리 구조 :
[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
(대안이 있다고 확신하지만), 그래서이 접근법 쉘에서 작동한다 (쉘의에서 하도mkdir
과rmdir
는 특히 외국인 인 경우)
대안으로, 팽키는 언급 코멘트에 -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.
'Development Tip' 카테고리의 다른 글
일종의 '파일 브라우저'모드를 사용하도록 nginx를 구성하는 방법은 무엇입니까? (0) | 2020.11.14 |
---|---|
PowerShell에서 줄을 나누는 방법은 무엇입니까? (0) | 2020.11.14 |
Node.js-최대 호출 스택 크기 초과 (0) | 2020.11.14 |
GCC가 "x && (x & 4242)"의 논리 비트 AND 쌍을 "x & 4242"로 최적화 할 수없는 이유는 무엇입니까? (0) | 2020.11.14 |
특정 연령보다 오래된 모든 Linux 프로세스를 어떻게 종료합니까? (0) | 2020.11.14 |