많은 git 저장소 관리
프로젝트 설정은 git에서 쉽기 때문에 작은 스크립트라도 별도의 저장소를 가질 수 있습니다. 이제 문제는 그것들을 관리하는 방법입니다.
저는 이러한 저장소로 여러 곳에서 작업합니다. 일부 저장소를 변경하면 다른 위치의 저장소를 업데이트 할 수 있기를 원합니다.
그래서 많은 저장소가있는 디렉토리가 있습니다.
- 모두 어떻게 가져올 수 있습니까?
- 커밋되지 않은 변경 사항이 있는지 어떻게 확인할 수 있습니까?
- 병합 할 변경 사항이 있는지 어떻게 확인할 수 있습니까?
그리고 하나의 명령으로 이것을 할 수 있으면 좋을 것입니다.
출력은 실제로 수행 할 작업을 인식 할 수있을만큼 조용해야합니다.
다중 저장소 도구 mr을 적극 권장합니다 . 한동안 다른 사람들이 권장하는 사용자 정의 셸 스크립트를 사용했지만 mr를 사용하면 다음과 같은 이점이 있습니다.
- 일반적입니다. git (예 : Mercurial, SVN 등)뿐만 아니라 다양한 버전 제어 시스템의 결합을 사용할 수 있습니다.
- 속도가 빠릅니다. mr는 여러 작업을 병렬로 실행할 수 있습니다. 여러 git / mercurial 저장소를 사용하고 하루에 여러 번 동기화합니다. Mr. Mr은이 과정을 엄청나게 가속화합니다.
- 저장소 체크 아웃 목록을 쉽고 빠르게 관리 할 수 있습니다. 사용자 정의 스크립트에서 프로젝트 목록을 수정하는 대신 'mr register'를 사용하십시오.
무음 출력에 대한 질문과 관련하여 : 명령 줄 스위치 -q를 사용하여 자세한 수준을 수정할 수 있습니다. 짧고 명확한 요약으로 출력을 멋지게 통합하는 기본 출력을 선호합니다.
mr 명령에 다음 별칭을 사용하여 mr가 항상 $ HOME에 저장된 기본 프로젝트 목록을 선택하고 5 개의 병렬 스레드를 사용하도록합니다.
alias mr='mr -d ~/ -j 5 '
나는 현재 받아 들여진 답변 (저장소를 반복하는 많은 도우미 스크립트)으로 시작했다고 말해야하지만 전반적으로 나에게는 부족한 경험이었습니다.
: 그래서 그래서, 난 내 자신의 변형하고 결국, 미스터을 시도한 후, REPO와 자식 - 서브 모듈, 나는 각각 다른 방식으로 부족한 발견 http://fabioz.github.io/mu-repo 성숙한 도구에서입니다 이 지점에는 다음을 수행 할 수있는 워크 플로가 있습니다.
- 여러 저장소 복제
- 여러 저장소의 현재 변경 사항 비교 (및 편집)
- 들어오는 변경 사항 미리보기
- 여러 저장소에서 병렬로 명령 실행
- 저장소 그룹 생성
- 여러 저장소에서 git 관련이 아닌 명령 실행
- 기타 (자세한 내용은 홈페이지 참조 ).
Python이 실행되는 모든 OS를 지원합니다.)
gr (git-run)은 mr 의 기능을확장합니다 (에만 해당git
). 태그 시스템을 사용하여 여러 git 저장소를 구성하는 것이 더 쉽습니다. 하지만에 대한 코드gr
는 잘 유지되지 않습니다. bash를 사용하는 경우form-t tag
대신에사용하십시오#tag
.
다음을 사용하여 시도 할 수 REPO을 사용자 정의로 manifest.xml
당신의 저장소가 위치를 지정하는 파일입니다. 이를 수행하는 방법에 대한 몇 가지 문서 가 있습니다 .
또는 당신은 사용할 수 있습니다 git-submodule(1
) .
gitslave 는 super와 subs 사이에 superproject / subproject 관계를 만들어 많은 저장소에서 동일한 명령을 실행할 수있는 도구입니다. 이것은 (기본적으로) 출력 요약을 제공하므로 고유 한 출력을 제공하는 저장소에 집중할 수 있습니다 (git 상태에 유용하지만 git ls 파일에는 유용하지 않음).
이것은 일반적으로 여러 저장소를 함께 어셈블하고 동일한 분기 또는 태그에 동시에 또는 무엇이든 유지해야하는 프로젝트에 사용됩니다. (베어) 리포지토리의 디렉토리에 대해 임의의 git 명령을 실행할 수있는 약간의 메이크 파일이 있습니다.이 명령은 주로 fsck 및 gc에 사용합니다.
full: fsck-full gc-aggressive
@:
fsck-full:
for f in */.; do (cd $$f; echo $$f; git fsck --full || echo $$f FAILED); done
gc-aggressive:
for f in */.; do (cd $$f; echo $$f; git gc --aggressive || echo $$f FAILED); done
%:
for f in */.; do (cd $$f; git $@ || echo $$f FAILED); done
예를 들어, git 저장소를 복제하거나 브랜치 전환과 같은 항목을 변경하자마자 자동으로 git 저장소를 발견하는 " RepoZ " 라는 도구를 작성했습니다 .
일단 발견되면 저장소는 "추적"됩니다. posh-git에서 영감을 얻은 고밀도 상태 정보를 포함하여 로컬 저장소 목록에 표시됩니다 . 여기에는 현재 분기와 파일 편집 및 수신 또는 발신 커밋 수와 같은 추가 항목이 포함됩니다.
이렇게하면 로컬 리포지토리와 완료되지 않은 작업을 추적하거나 푸시하는 데 도움이됩니다. 또한 저장소 목록을 탐색으로 사용하여 한 저장소에서 다른 저장소로 전환 할 수 있습니다.
"어떻게 그들 모두를 가져올 수 있습니까?"
Windows 용 버전은 리포지토리를 가져 오거나 가져올 수있는 컨텍스트 메뉴를 제공합니다. 다중 선택을 사용하면 한 번에 여러 저장소에서 작업을 실행할 수 있습니다.
그러나 매우 유용한 다른 기능을 찾을 수 있습니다.
자동 가져 오기를 사용하면 백그라운드에서 주기적으로 모든 git 저장소의 원격을 가져 오도록 RepoZ에 지시 할 수 있습니다. 물론 이러한 가져 오기는 로컬 커밋과 충돌하지 않습니다. 와 같은 로컬 병합 시도는 없습니다 git pull
.
이 스크립트를 사용하여 모든 저장소에서 git 명령을 쉽게 실행합니다.
#!/bin/sh
if [ ! "$1" = "" ] ; then
if [ "$GITREPO" = "" -a -d "$HOME/cm/src" ] ; then
GITREPO="$HOME/cm/src"
fi
if [ "$GITREPO" != "" ] ; then
echo "Git repositories found in $GITREPO"
echo "-=-=-=-=-=-=-=-=-=-=-=-=-=-"
DIRS="`/bin/ls -1 $GITREPO`"
for dir in $DIRS ; do
if [ -d $GITREPO/$dir/.git ] ; then
echo "$dir -> git $1"
cd $GITREPO/$dir ; git $@
echo
fi
done
else
echo "Git repositories not found."
fi
fi
기본적으로 스크립트는 ~ / cm / src에서 git 저장소를 찾지 만 GITREPO 환경 변수를 원하는대로 설정하여이를 재정의 할 수 있습니다.
이 스크립트는이 스크립트를 기반으로 합니다 .
이를 위해 git-status-all
gem을 사용할 수 있습니다 : https://github.com/reednj/git-status-all
# install the gem
gem install git-status-all
# use the status-all subcommand to scan the directory
git status-all
상태를 표시하기 전에 모든 저장소에 대해 오리진에서 가져 오는 가져 오기 옵션도 있습니다.
git status-all --fetch
누군가가 여전히이 스레드를보고 있다면 gitme라는 쉘 스크립트를 확인하십시오.
로컬 git 저장소를 수동으로 입력해야하지만 매일이 도구를 사용하여 여러 컴퓨터에서 여러 git 프로젝트를 공동 작업합니다.
당신은 실행할 수 있습니다 git clone https://github.com/robbenz/gitme.git
또한 스크립트는 아래에 게시됩니다
#!/bin/bash -e
REPOS=(
/Users/you/gitrepo1
/Users/you/gitrepo2
/Users/you/gitrepo3
/Users/you/gitrepo4
)
MOVE="Moving to next REPO... \n"
tput setaf 2;echo "What ya wanna do? You can say push, pull, commit, ftp push, or status"; tput sgr0
read input
if [ $input = "commit" ]
then
tput setaf 2;echo "Do you want a unique commit message? [y/n]";tput sgr0
read ans
if [ $ans = "y" ]
then
for i in "${REPOS[@]}"
do
cd "$i"
tput setaf 6;pwd;tput sgr0
git add . -A
read -p "Commit description: " desc
git commit -m "$desc"
tput setaf 2;echo $MOVE;tput sgr0
sleep 1
done
else
for i in "${REPOS[@]}"
do
cd "$i"
tput setaf 6;pwd;tput sgr0
git add . -A
git commit -m "autocommit backup point"
tput setaf 2;echo $MOVE;tput sgr0
sleep 1
done
fi
elif [ $input = "push" ] || [ $input = "pull" ] || [ $input = "ftp push" ] || [ $input = "status" ]
then
for i in "${REPOS[@]}"
do
cd "$i"
tput setaf 6;pwd;tput sgr0
git $input
tput setaf 2;echo $MOVE;tput sgr0
sleep 1
done
else tput setaf 1;echo "You have zero friends";tput sgr0
fi
~ / .bash_profile에 별칭을 설정하여 alias gitme='sh /path/to/gitme.sh'
디렉토리에서 사용 가능한 모든 저장소에서 (재귀 적으로) git 명령을 실행하는 별칭과 함수를 만들었습니다. 여기에서 찾을 수 있습니다 : https://github.com/jaguililla/dotfiles/git
다음은 코드입니다.
#!/bin/sh
# To use it: source git_aliases
# Example: rgita remote \;
alias rgita='find . -type d -name .git -execdir git'
# Example: rgit remote -vv
rgit() {
rgita "$@" \;
}
도움이되기를 바랍니다 :)
디렉토리 트리의 모든 저장소에서 git 명령을 재귀 적으로 실행하는 CPAN 에서 rgit 을 확인해야합니다 .
문서에서 :
이 유틸리티는 모든 git 리포지토리에 대해 루트 디렉터리 (현재 작업 디렉터리 또는 GIT_DIR 환경 변수로 지정된 디렉터리)에서 반복적으로 검색합니다.이 목록을 저장소 경로별로 정렬하고 chdir을 지정된 git 명령을 실행합니다.
나는 방금 당신이 원하는 것을하는 도구를 만들었습니다!
- 모두 어떻게 가져올 수 있습니까?
gmaster fetch
- 커밋되지 않은 변경 사항이 있는지 어떻게 확인할 수 있습니까?
gmaster status
- 병합 할 변경 사항이 있는지 어떻게 확인할 수 있습니까?
gmaster status
gitmaster : https://github.com/francoiscabrol/gitmaster
이 간단한 bash 함수를 .bash_profile에 작성하여 모든 git 저장소에서만 git, maven, gradle 또는 기타 bash 명령을 실행할 수 있습니다.
# usefull function to work with multiple git repositories
all() {
failed=0
printf '>>> START RUNNING: "%s" >>>' "$*"
for d in */; do
pushd "$d" > /dev/null
if [ -d ".git" ]
then
printf '\n--------------------------------------------\n\n'
pwd
eval $@
if [ $? -ne 0 ]
then
failed=1
break;
fi
fi
popd > /dev/null
done
if [ $failed -eq 0 ]
then
printf '\n--------------------------------------------\n'
printf '<<< RAN "%s" WITH SUCCESS!!! <<<' "$*"
else
printf '\n<<< FAILED!!! <<<'
fi
}
이 방법으로 사용할 수 있습니다.
all git st
all git pull
all ./gradlew clean test
etc.
여러 저장소 를 관리하기 위해 gita 라는 명령 줄 도구를 작성했습니다 . 예를 들어 등록 된 저장소의 상태를 나란히 표시합니다.
또한 모든 작업 디렉토리에서 git 명령 / 별칭을 위임 할 수 있습니다.
이제이 도구를 사용하여 질문에 답하십시오.
모두 어떻게 가져올 수 있습니까?
gita fetch
커밋되지 않은 변경 사항이 있는지 어떻게 확인할 수 있습니까?
이 gita ls
명령은 분기 이름 옆에 3 개의 가능한 기호를 표시합니다.
+
: 단계적 변경*
: 무단계 변경_
: 추적되지 않는 파일 / 폴더
병합 할 변경 사항이 있는지 어떻게 확인할 수 있습니까?
지점 이름은 5 가지 색상으로 표시됩니다.
- 흰색 : 로컬 분기에 원격 분기가 없습니다.
- 녹색 : 로컬 분기가 원격 분기와 동일합니다.
- 빨간색 : 로컬 분기가 원격 분기에서 분기되었습니다.
- 자주색 : 로컬 분기가 원격 분기보다 앞서 있습니다 (푸시에 적합).
- 노란색 : 로컬 분기가 원격 분기 뒤에 있습니다 (병합에 적합).
설치하려면 다음을 실행하십시오.
pip3 install -U gita
면책 조항 : www.repoflow.com 에서이 도구를 작업 하고 있습니다.
모두 어떻게 가져올 수 있습니까?
병합 할 변경 사항이 있는지 어떻게 확인할 수 있습니까?
- 관련된 모든 리포지토리를 가져올 수 있습니다 (또는 푸시 / 풀 / 커밋). 페치 후 UI가 새 리포지토리 상태로 업데이트되고 리포지토리가 분기되면 충돌 종류를 확인하고 병합을 시작할 수 있습니다.
커밋되지 않은 변경 사항이 있는지 어떻게 확인할 수 있습니까?
- UI에서 각 저장소의 파일 상태를 볼 수 있습니다 (개별적으로 또는 대량으로 추가 / 제거 할 수 있음).
I am working on this, but this is also solving the OP questions and help manage multiple repositories in general, you can use the UI or the underlying GraphQL API to create your own scripts, please consider it as another option.
There's a handy tool to fetch all multiple repositories. git-pull-all
is a command line tool to execute on multiple git repositories in asynchronously.
Installation
npm install -g git-pull-all
Usage
Assume you have these files and directories:
~/Projects/
cool-examples/
.git/
funny-movies/
my-todos.txt
super-express/
.git/
When you run git-pull-all
command on ~/Projects
directory, it should find child git repositories (in the above case cool-examples and super-express) then execute git pull
on each of them.
$ cd ~/Projects
$ git-pull-all
funny-movies/
Not a git repository
cool-examples/
Already up-to-date.
super-express/
Already up-to-date.
Done!
git-pull-all ~/Projects
GitHub link: https://github.com/tatsuyaoiw/git-pull-all
I use Visual Studio code. We have around 20 libraries in our codebase that are all separate Git repos, and the source control tab in Visual Studio Code is pretty good for seeing an "at a glance" view of how far behind or ahead local repos are. There are also settings to periodically fetch to keep that info up to date, as well as a refresh button.
Its not as convenient as a script, but when it comes to source control for me I like to be the one making changes. It takes a very well-written script to be careful to not overwrite changes, etc. With the VS Code approach, you get a good amount of info quickly that you can act on yourself.
Here is a screenshot of what it looks like:
https://github.com/wwjamieson3/envisionTools has a bash script called gitstat that does this and a whole lot more. It's GNU and mac compatible. It can perform fetches from remotes if asked. It shows untracked, modified, added, deleted and staged files. It differences with remotes by showing unmerged commits on remotes and unpushed local commits. It also can display color coded results in summary or detailed mode and even HTML. It uses locate instead of find because it's infinitely faster and will even prompt to update your locate database if it's getting too old.
Looks like writing a script to do it is quite easy. Essentially it needs to iterate over the repositories and then use commands like git ls-files, git diff and git log.
참고 URL : https://stackoverflow.com/questions/816619/managing-many-git-repositories
'IT박스' 카테고리의 다른 글
node.js에서 jQuery ajax 호출을 사용하는 방법 (0) | 2020.11.02 |
---|---|
git am error : "patch does not apply" (0) | 2020.11.02 |
WPF 애플리케이션의 기본 글꼴을 설정하는 방법은 무엇입니까? (0) | 2020.11.02 |
IIS 인스턴스에 디버거 연결 (0) | 2020.11.01 |
NSFetchedResultsController-문자열의 첫 글자로 생성 된 섹션 (0) | 2020.11.01 |