많은 git 저장소 관리


85

프로젝트 설정은 git에서 쉽기 때문에 작은 스크립트라도 별도의 저장소를 가질 수 있습니다. 이제 문제는 그것들을 관리하는 방법입니다.

저는 이러한 저장소로 여러 곳에서 작업합니다. 일부 저장소를 변경하면 다른 위치의 저장소를 업데이트 할 수 있기를 원합니다.

그래서 많은 저장소가있는 디렉토리가 있습니다.

  1. 모두 어떻게 가져올 수 있습니까?
  2. 커밋되지 않은 변경 사항이 있는지 어떻게 확인할 수 있습니까?
  3. 병합 할 변경 사항이 있는지 어떻게 확인할 수 있습니까?

그리고 하나의 명령으로 이것을 할 수 있으면 좋을 것입니다.

출력은 실제로 수행 할 작업을 인식 할 수있을만큼 조용해야합니다.


대해 동일한 질문에 답변 했습니다 hg mercurial.
Serge Stroobandt

답변:


44

다중 저장소 도구 mr을 적극 권장합니다 . 한동안 다른 사람들이 권장하는 사용자 정의 셸 스크립트를 사용했지만 mr를 사용하면 다음과 같은 이점이 있습니다.

  • 일반적입니다. git (예 : Mercurial, SVN 등)뿐만 아니라 다양한 버전 제어 시스템의 결합을 사용할 수 있습니다.
  • 속도가 빠릅니다. mr는 여러 작업을 병렬로 실행할 수 있습니다. 여러 git / mercurial 저장소를 사용하고 하루에 여러 번 동기화합니다. Mr. Mr은이 과정을 엄청나게 가속화합니다.
  • 저장소 체크 아웃 목록을 쉽고 빠르게 관리 할 수 ​​있습니다. 사용자 정의 스크립트에서 프로젝트 목록을 수정하는 대신 'mr register'를 사용하십시오.

무음 출력에 대한 질문과 관련하여 : 자세한 수준은 명령 줄 스위치 -q를 사용하여 수정할 수 있습니다. 짧고 명확한 요약으로 출력을 멋지게 통합하는 기본 출력을 선호합니다.

mr 명령에 다음 별칭을 사용하여 mr가 항상 $ HOME에 저장된 기본 프로젝트 목록을 선택하고 5 개의 병렬 스레드를 사용하도록합니다.

alias mr='mr -d ~/ -j 5 '

5
Windows를 지원합니까?
Fitzchak Yitzchaki 2013

그것은 위대한하지만 (2016-08 현재) 자식 태그를 지원하지 않습니다
휴고 사라고사

@CADbloke는 설치 페이지에서 창을 언급하지 않지만 Perl 스크립트로서 Windows에서 작동 할 수도 있고 작동해야 할 수도 있습니다.
scipilot

2
@HugoZaragoza,이 명령은 언제든지 직접 정의 할 수 있습니다. [DEFAULT] tag = git tag "$ @"
AlexS

2
alias pa='find . -name .git -print -execdir git pull \;'다음, pa충분하다
DawnSong

19

나는 현재 받아 들여진 답변 (저장소를 반복하는 많은 도우미 스크립트)으로 시작했다고 말해야하지만, 전반적으로 나에게는 부족한 경험이었습니다.

그래서 mr, repo 및 git-submodules를 시도한 후 각기 다른 방식으로 부족하다는 것을 알게 되었기 때문에 http://fabioz.github.io/mu-repo 에서 성숙한 도구 인 http://fabioz.github.io/mu-repo 를 수행 했습니다. 이 지점에는 다음을 수행 할 수있는 워크 플로가 있습니다.

  • 여러 저장소 복제
  • 여러 저장소의 현재 변경 사항 비교 (및 편집)
  • 들어오는 변경 사항 미리보기
  • 여러 저장소에서 병렬로 명령 실행
  • 저장소 그룹 생성
  • 여러 저장소에서 git 관련이 아닌 명령 실행
  • 기타 (자세한 내용은 홈페이지 참조 ).

Python이 실행되는 모든 OS를 지원합니다.)


당신의 대답은 mu-repo가 ​​mr가하는 것보다 낫다는 것을 암시합니다. 그러나 mu-repo는 비 git 저장소를 지원하지 않습니다.
Shaunak Sontakke

1
그 목적은 실제로 git repos (질문이 요청한 것임) 만 지원하는 것입니다 mu sh <some command>. 여러 저장소에서도 임의의 명령을 실행할 수 있지만 전체 최종성은 다른 버전 제어 시스템이 아닌 git을 처리하는 것입니다. . 필요한 경우 다른 도구를 사용하십시오.
Fabio Zadrozny

14

gr (git-run)은 mr 의 기능을확장합니다 (에만 해당git). 태그 시스템을 사용하여 여러 git 저장소를 구성하는 것이 더 쉽습니다. 하지만에 대한 코드gr는 잘 유지되지 않습니다. bash를 사용하는 경우form-t tag대신에사용하십시오#tag.


그 이후로 개발이 약간 회복 된 것 같습니다. github.com/mixu/gr/graphs/contributors
Dave Forgac 2015

8

다음을 사용하여 시도 할 수 REPO을 사용자 정의로 manifest.xml당신의 저장소가 위치를 지정하는 파일입니다. 이를 수행하는 방법에 대한 몇 가지 문서 가 있습니다 .

또는 당신은 사용할 수 있습니다 git-submodule(1) .


2
저장소를 똑같은 상태로 유지하고 싶다면 git-submodule이 좋을 것이지만 그렇지 않습니다. 저장소 세트는 각 위치에서 동일하지 않습니다. 커밋되지 않은 변경이있을 수 있습니다. 아직 병합하고 싶지 않은 변경 사항이있을 수 있습니다.
iny

git-submodule에 대해 몰랐습니다. 언급 해 주셔서 감사합니다.
sykora

repo에 대한 문서는 아주 최소한이며 사용하려는 다른 종류의 작업 흐름을위한 것 같습니다.
iny

6

예를 들어, git 저장소를 복제하거나 브랜치 전환과 같은 항목을 변경하자마자 자동으로 git 저장소를 발견하는 " RepoZ " 라는 도구를 작성했습니다 .

일단 발견되면 저장소는 "추적"됩니다. posh-git에서 영감을 얻은 고밀도 상태 정보를 포함하여 로컬 저장소 목록에 표시됩니다 . 여기에는 현재 분기와 파일 편집 및 수신 또는 발신 커밋 수와 같은 추가 항목이 포함됩니다.

RepoZ UI

이렇게하면 로컬 리포지토리와 완료되지 않은 작업을 추적하거나 푸시하는 데 도움이됩니다. 또한 저장소 목록을 탐색으로 사용하여 한 저장소에서 다른 저장소로 전환 할 수 있습니다.

RepoZ 탐색

"어떻게 그들 모두를 가져올 수 있습니까?"

Windows 용 버전은 리포지토리를 가져 오거나 가져올 수있는 컨텍스트 메뉴를 제공합니다. 다중 선택을 사용하면 한 번에 여러 저장소에서 작업을 실행할 수 있습니다.

그러나 매우 유용한 다른 기능을 찾을 수 있습니다.

RepoZ 자동 가져 오기

자동 가져 오기를 사용하면 백그라운드에서 주기적으로 모든 git 저장소의 원격을 가져 오도록 RepoZ에 지시 할 수 있습니다. 물론 이러한 가져 오기는 로컬 커밋과 충돌하지 않습니다. 와 같은 로컬 병합 시도는 없습니다 git pull.


예, 너무 나쁘고 자격이 없습니다. 언제든지 PR을 위해 개방됩니다. 나 한테 알려줘.
Waescher

5

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

5

디렉토리에서 사용 가능한 모든 저장소에서 (재귀 적으로) 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 "$@" \;
}

도움이되기를 바랍니다 :)


1
슬림하고 유용합니다!
Kevin Chou

Fantatstic! 넣을 간단한 한 줄 .bash_aliases: alias rgit='function _rgit(){ find . -type d -name .git -printf "\n%p\n" -execdir git "$@" \;; }; _rgit'. 그것을 소싱하고 예를 들어 rgit status.
ford04

4

이를 위해 git-status-allgem을 사용할 수 있습니다 : 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

자식 상태 모두


1
아주 좋은 접근입니다. 투표율이 높은 대부분의 도구와 달리 먼저 리포지토리를 등록 할 필요가 없습니다. 대신 모든 하위 디렉터리를 확인하기 만하면됩니다.
luator

find . -name .git -print -execdir git status \;OK입니다
DawnSong

3

이 스크립트를 사용하여 모든 저장소에서 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 환경 변수를 원하는대로 설정하여이를 재정의 할 수 있습니다.

이 스크립트는이 스크립트를 기반으로 합니다 .


find . -name .git -print -execdir git pull \;당신이 생각하는대로합니다.
DawnSong dec

3

여러 저장소 를 관리하기 위해 gita 라는 명령 줄 도구를 작성했습니다 . 예를 들어 등록 된 저장소의 상태를 나란히 표시합니다.

여기에 이미지 설명 입력

또한 모든 작업 디렉토리에서 git 명령 / 별칭을 위임 할 수 있습니다.

이제이 도구를 사용하여 질문에 답하십시오.

모두 어떻게 가져올 수 있습니까?

gita fetch

커밋되지 않은 변경 사항이 있는지 어떻게 확인할 수 있습니까?

gita ls명령은 분기 이름 옆에 3 개의 가능한 기호를 표시합니다.

  • +: 단계적 변경
  • *: 무단계 변경
  • _: 추적되지 않는 파일 / 폴더

병합 할 변경 사항이 있는지 어떻게 확인할 수 있습니까?

지점 이름은 5 가지 색상으로 표시됩니다.

  • 흰색 : 로컬 분기에 원격 분기가 없습니다.
  • 녹색 : 로컬 분기가 원격 분기와 동일합니다.
  • 빨간색 : 로컬 분기가 원격 분기에서 분기되었습니다.
  • 자주색 : 로컬 분기가 원격 분기보다 앞서 있습니다 (푸시에 적합).
  • 노란색 : 로컬 분기가 원격 분기 뒤에 있습니다 (병합에 적합).

설치하려면 다음을 실행하십시오.

pip3 install -U gita

2

누군가가 여전히이 스레드를보고 있다면 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'


1

디렉토리 트리의 모든 저장소에서 git 명령을 재귀 적으로 실행하는 CPAN 에서 rgit 을 확인해야합니다 .

문서에서 :

이 유틸리티는 모든 git 리포지토리에 대해 루트 디렉터리 (현재 작업 디렉터리 또는 GIT_DIR 환경 변수로 지정된 디렉터리)에서 반복적으로 검색합니다.이 목록을 저장소 경로별로 정렬하고 chdir을 지정된 git 명령을 실행합니다.


1

나는 방금 당신이 원하는 것을하는 도구를 만들었습니다!

  1. 모두 어떻게 가져올 수 있습니까? gmaster fetch
  2. 커밋되지 않은 변경 사항이 있는지 어떻게 확인할 수 있습니까? gmaster status
  3. 병합 할 변경 사항이 있는지 어떻게 확인할 수 있습니까? gmaster status

gitmaster : https://github.com/francoiscabrol/gitmaster


1

이 간단한 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.

하나는 사용하여 병렬로 그들 모두를 실행할 수 있습니다 : 모든 '깨끗한 테스트 및을 ./gradlew'
ChaudPain

0

면책 조항 : www.repoflow.com 에서이 도구에 대해 작업 하고 있습니다.

모두 어떻게 가져올 수 있습니까?
병합 할 변경 사항이 있는지 어떻게 확인할 수 있습니까?

  • 관련된 모든 리포지토리를 가져올 수 있습니다 (또는 푸시 / 풀 / 커밋). 페치 후 UI가 새 리포지토리 상태로 업데이트됩니다. 리포지토리가 분기되면 충돌 종류를 확인하고 병합을 시작할 수 있습니다.

여기에 이미지 설명 입력

커밋되지 않은 변경 사항이 있는지 어떻게 확인할 수 있습니까?

  • UI에서 각 저장소의 파일 상태를 볼 수 있습니다 (개별적으로 또는 대량으로 추가 / 제거 할 수 있음).

여기에 이미지 설명 입력

나는 이것에 대해 작업하고 있지만 이것은 또한 OP 질문을 해결하고 일반적으로 여러 저장소를 관리하는 데 도움이됩니다 .UI 또는 기본 GraphQL API를 사용하여 자신의 스크립트를 만들 수 있습니다. 다른 옵션으로 고려하십시오.


0

여러 저장소를 모두 가져올 수있는 편리한 도구가 있습니다. git-pull-all여러 git 저장소에서 비동기식으로 실행하는 명령 줄 도구입니다.

설치

npm install -g git-pull-all

용법

다음 파일과 디렉토리가 있다고 가정합니다.

~/Projects/
  cool-examples/
    .git/
  funny-movies/
  my-todos.txt
  super-express/
    .git/

디렉토리에서 git-pull-all명령 을 실행하면 ~/Projects하위 git 저장소 (위의 경우 cool-examplessuper-express )를 찾은 다음 git pull각각에서 실행 해야합니다.

$ 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 링크 : https://github.com/tatsuyaoiw/git-pull-all


0

Visual Studio 코드를 사용합니다. 코드베이스에는 모두 별도의 Git 리포지토리 인 약 20 개의 라이브러리가 있으며 Visual Studio Code의 소스 제어 탭은 로컬 리포지토리가 얼마나 늦거나 앞선 지에 대한 "한눈에"보기에 매우 좋습니다. 정보를 최신 상태로 유지하기 위해 주기적으로 가져 오는 설정과 새로 고침 버튼도 있습니다.

스크립트만큼 편리하지는 않지만 소스 제어에 관해서는 변경하는 사람이되고 싶습니다. 변경 사항 등을 덮어 쓰지 않도록주의하려면 매우 잘 작성된 스크립트가 필요합니다. VS Code 접근 방식을 사용하면 스스로 조치를 취할 수있는 많은 정보를 빠르게 얻을 수 있습니다.

다음은 그 모습의 스크린 샷입니다.

VS Code의 소스 제어 창


0

.git 폴더가있는 모든 하위 디렉터리에서 현재 브랜치를 가져 오기위한 훌륭한 솔루션을 찾았습니다. 각 저장소에 다른 브랜치가 체크 아웃 된 경우에도 마찬가지입니다. 이 명령은 한 줄로되어 있으며 다른 git 명령을 수정할 수있을만큼 유연하며 별칭을 지정할 수 있습니다.

다음을 복사하여 붙여 넣으십시오.

find . -type d -maxdepth 2 -name .git -exec sh -c 'cd $0 && cd .. && git pull origin $(git rev-parse --abbrev-ref HEAD)' {} \;

분석 :

find . -type d -maxdepth 2 -name .git 

현재 디렉토리 (find.)에서 이름이 ".git"(-name .git) 인 모든 디렉토리 (-type d)를 찾아 최대 2 개의 디렉토리 깊이 (1이 아닌 2 개)를 찾습니다. git repo 폴더 내의 git 폴더).

-exec sh -c 

다음 셸 명령을 실행합니다 (exec sh -c).

'cd $0 && cd .. && git pull origin $(git rev-parse --abbrev-ref HEAD)'

디렉터리를 첫 번째 인수 (cd $ 0)로 변경 한 다음 디렉터리를 한 수준 위로 변경하여 .git 폴더 (cd ..)를 남겨두고 현재 분기에 대해 git rev-parse ...를 실행하여 분기를 지정하면서 git pull origin을 수행합니다. HEAD 커밋.

{} \;

"{}"는 초기 find 명령 에서 얻은 결과 상대 경로 입니다. ; 명령을 종료하는 데 사용됩니다.

zsh의 MacOS 10.14.6에서 테스트되었습니다. 있는 그대로 원격 및 로컬 분기의 이름이 동일한 AFAIK 인 경우에만 작동합니다.

이를 수정하여 상태를 가져올 수 있습니다. 나는 당신이 이것을 더 유연하게 만들기 위해 논쟁을 추가 할 수 있다고 기대하지만 아직 시도하지 않았습니다.


-1

https://github.com/wwjamieson3/envisionTools 에는이를 수행하는 gitstat라는 bash 스크립트가 있습니다. GNU 및 Mac과 호환됩니다. 요청시 리모컨에서 가져 오기를 수행 할 수 있습니다. 추적되지 않은, 수정 된, 추가, 삭제 및 준비된 파일을 표시합니다. 리모트에 병합되지 않은 커밋과 푸시되지 않은 로컬 커밋을 표시함으로써 리모트와 차이가 있습니다. 또한 요약 또는 세부 모드 및 HTML까지 색상 코드 결과를 표시 할 수 있습니다. 그것은 무한히 빠르기 때문에 find 대신 find를 사용하고 너무 오래되면 위치 데이터베이스를 업데이트하라는 메시지를 표시합니다.


2
답변을 게시 해 주셔서 감사합니다! Self-Promotion에 대한 FAQ를 주의 깊게 읽어 보시기 바랍니다 . 또한 자신의 사이트 / 제품에 연결할 때마다 면책 조항을 게시 해야 합니다.
Andrew Barber

3
불행히도 github wwjamieson3 / envisionTools 링크가 끊어졌습니다.
Brenda J. Butler

@williamJamieson은 envisionTools가 개인 GitHub 저장소입니까?
eebbesen 2015-08-27

-5

스크립트를 작성하는 것은 매우 쉬운 것 같습니다. 기본적으로 리포지토리를 반복 한 다음 git ls-files, git diff 및 git log와 같은 명령을 사용해야합니다.


늦었지만 대본을 게시 할 수 있습니까?
l0b0

"스크립트"가 없습니다. 내 필요에 맞게 작성한 스크립트를 사용하고 있지만 일반적이지 않습니다.
iny

"git diff"는 단일 패치 명령으로 되돌리고 다시 적용 할 수있는 단일 diff 파일을 얻으려면 실제로 까다 롭습니다.
proski

4
말 그대로 모든 답변이 허용되는 답변이어야하지만 이것입니다.
Kennet Celeste 19
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.