폴더에서 하위 모듈 저장소를 만들고 git 커밋 기록을 유지합니다.
특정 방식으로 다른 웹 애플리케이션을 탐색하는 웹 애플리케이션이 있습니다. demos
폴더 에 일부 웹 데모가 포함되어 있으며 데모 중 하나에 자체 저장소가 있어야합니다. 이 데모 응용 프로그램에 대한 별도의 저장소를 만들고하위 패키지 커밋 기록을 잃지 않고 주 저장소의 하위 모듈 .
리포지토리 폴더의 파일에서 커밋 기록을 유지하고 거기에서 리포지토리를 만들고 대신 서브 모듈 로 사용할 수 있습니까?
세부 솔루션
npm을 사용하는 git 하위 모듈에 대한 빠른 대안은이 답변 끝에있는 참고 (마지막 단락)를 참조하십시오.)
다음 답변에서는 저장소에서 폴더를 추출하고 거기에서 git 저장소를 만든 다음 폴더 대신 하위 모듈 로 포함하는 방법을 알 수 있습니다.
Gerg Bayer의 기사 에서 Git 저장소 간에 파일 이동, 기록 보존 에서 영감을 얻었습니다.
처음에는 다음과 같은 것이 있습니다.
<git repository A>
someFolders
someFiles
someLib <-- we want this to be a new repo and a git submodule!
some files
단계가 울부 짖는 소리, 나는 이것을 참조 할 것 someLib
같은 <directory 1>
.
마지막에는 다음과 같은 것이 있습니다.
<git repository A>
someFolders
someFiles
@submodule --> <git repository B>
<git repository B>
someFolders
someFiles
다른 저장소의 폴더에서 새 git 저장소 만들기
1 단계
분할 할 저장소의 새 복사본을 가져옵니다.
git clone <git repository A url>
cd <git repository A directory>
2 단계
현재 폴더가 새 저장소가되므로 현재 원격을 제거하십시오.
git remote rm origin
3 단계
원하는 폴더의 기록을 추출하고 커밋합니다.
git filter-branch --subdirectory-filter <directory 1> -- --all
이제 directory 1
모든 관련 커밋 기록과 함께 저장소의 루트에 있는 파일이있는 git 저장소가 있어야합니다 .
4 단계
온라인 저장소를 만들고 새 저장소를 푸시하십시오!
git remote add origin <git repository B url>
git push
upstream
첫 번째 푸시를 위해 분기 를 설정해야 할 수 있습니다.
git push --set-upstream origin master
정리 <git repository A>
(선택 사항, 주석 참조)
우리는의 (역사를 파일과 커밋) 흔적을 삭제할 <git repository B>
에서 <git repository A>
한 번만이이 폴더에 대한 역사 때문에.
이는 github에서 민감한 데이터 제거를 기반으로 합니다.
새 폴더로 이동하고
git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all
<directory 1>
제거하려는 폴더로 바꿉니다 . -r
지정된 디렉토리 내에서 재귀 적으로 수행합니다. :). 지금에 밀어 origin/master
와--force
git push origin master --force
보스 스테이지 (아래 참고 참조)
크리에이트 서브 모듈 에서 <git repository B>
로를<git repository A>
git submodule add <git repository B url>
git submodule update
git commit
Verify if everything worked as expected and push
git push origin master
Note
After doing all of this, I realized in my case that it was more appropriate to use npm to manage my own dependencies instead. We can specify git urls and versions, see the package.json git urls as dependencies.
If you do it this way, the repository you want to use as a requirement must be an npm module so it must contain a package.json
file or you'll get this error: Error: ENOENT, open 'tmp.tgz-unpack/package.json'
.
tldr (alternative solution)
You may find it easier to use npm and manage dependencies with git urls:
- Move folder to a new repository
- run
npm init
inside both repositories - run
npm install --save git://github.com/user/project.git#commit-ish
where you want your dependencies installed
The solution by @GabLeRoux squashes the branches, and the related commits.
A simple way to clone and keep all those extra branches and commits:
1 - Make sure you have this git alias
git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
2 - Clone the remote, pull all branches, change the remote, filter your directory, push
git clone git@github.com:user/existing-repo.git new-repo
cd new-repo
git clone-branches
git remote rm origin
git remote add origin git@github.com:user/new-repo.git
git remote -v
git filter-branch --subdirectory-filter my_directory/ -- --all
git push --all
git push --tags
GabLeRoux's solution works well except if you use git lfs
and has large files under the directory you want to detach. In that case, after step 3 all the large files will remain to be pointer files instead of real files. I guess it's probably due to the .gitattributes
file being removed in the filter branch process.
Realizing this, I find the following solution works for me:
cp .gitattributes .git/info/attributes
Copying .gitattributes
which git lfs uses to track large files to .git/
directory to avoid being deleted.
When filter-branch is done don't forget to put back the .gitattributes
if you still want to use git lfs for the new repository:
mv .git/info/attributes .gitattributes
git add .gitattributes
git commit -m 'added back .gitattributes'
'developer tip' 카테고리의 다른 글
Heroku 애플리케이션 DNS를 Godaddy 도메인에 구성하는 방법은 무엇입니까? (0) | 2020.08.25 |
---|---|
Python 생성자 및 __init__ (0) | 2020.08.25 |
Intellij IDEA에서 메서드 매개 변수 힌트를 표시하는 방법은 무엇입니까? (0) | 2020.08.25 |
'확장'파일 속성 읽기 / 쓰기 (C #) (0) | 2020.08.25 |
System.BadImageFormatException : installutil.exe에서 파일 또는 어셈블리를로드 할 수 없습니다. (0) | 2020.08.25 |