2009-05-03 42 views
49

Thiết lập dự án dễ dàng trong git và vì vậy tôi có thể có kho lưu trữ riêng ngay cả đối với tập lệnh nhỏ. Bây giờ vấn đề là làm thế nào để quản lý chúng.Quản lý nhiều kho lưu trữ git

Tôi làm việc ở nhiều nơi với các kho lưu trữ này. Khi tôi đã thực hiện thay đổi cho một số kho lưu trữ, tôi muốn có thể cập nhật các kho lưu trữ ở những nơi khác.

Vì vậy, tôi có một thư mục có nhiều kho lưu trữ trong đó.

  1. Tôi làm cách nào để tìm nạp tất cả chúng?
  2. Làm cách nào để kiểm tra xem có bất kỳ thay đổi nào trong số những thay đổi không được cam kết không?
  3. Làm cách nào để kiểm tra xem có bất kỳ thay đổi nào để hợp nhất không?

Và sẽ thật tuyệt nếu có thể thực hiện điều này bằng một lệnh.

Đầu ra cần đủ im lặng để thực sự nhận thấy những điều cần làm.

+0

Cùng một câu hỏi [trả lời] (https://stackoverflow.com/a/48790388/2192488) cho 'hg mercurial'. –

Trả lời

-1

Có vẻ như viết một kịch bản để làm điều đó khá dễ dàng. Về cơ bản nó cần phải lặp qua các kho và sau đó sử dụng các lệnh như git ls-files, git diff và git log.

+0

Tôi biết đã muộn nhưng bạn có thể xuất bản tập lệnh không? – l0b0

+0

Không có "tập lệnh". Tôi đang sử dụng một kịch bản mà tôi đã viết cho các nhu cầu của riêng tôi, nhưng nó không phải là chung chung. – iny

+0

"git diff" thực sự phức tạp nếu bạn muốn lấy một tệp diff khác có thể được hoàn nguyên và áp dụng lại với một lệnh vá đơn. – proski

6

Bạn có thể thử sử dụng repo với tệp tùy chỉnh manifest.xml để chỉ định nơi lưu trữ của bạn. Có some documentation về cách thực hiện việc này.

Hoặc bạn có thể sử dụng git-submodule(1).

+1

git-submodule sẽ là tốt, nếu tôi muốn giữ các kho lưu trữ ở cùng một trạng thái chính xác, nhưng đó không phải là trường hợp. Tập hợp các kho lưu trữ không giống nhau ở mỗi nơi. Có thể có những thay đổi không được cam kết. Có thể có những thay đổi mà tôi không muốn hợp nhất. – iny

+0

Tôi không biết về git-submodule. Cảm ơn bạn đã đề cập đến nó. – sykora

+0

Tài liệu cho repo là khá tối thiểu và có vẻ như nó được thiết kế cho loại công việc khác nhau mà tôi muốn sử dụng. – iny

0

Bạn nên kiểm tra rgit trên CPAN thực thi đệ quy lệnh git trên tất cả các kho lưu trữ trong cây thư mục.

Từ các tài liệu:

Tiện ích này một cách đệ quy tìm kiếm trong một thư mục gốc (có thể là thư mục làm việc hiện tại hoặc - nếu nó đã được thiết lập - các thư mục nhất định bởi biến môi trường GIT_DIR) cho tất cả kho lưu trữ git, sắp xếp danh sách này theo đường dẫn lưu trữ, chdir vào từng vị trí và thực hiện lệnh git được chỉ định.

3

Tôi sử dụng tập lệnh này để dễ dàng thực thi lệnh git trong tất cả các kho lưu trữ của tôi.

#!/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 [email protected] 
      echo 
     fi 

     done 
    else 

     echo "Git repositories not found." 

    fi 
fi 

Theo mặc định tập lệnh sẽ tìm kho lưu trữ git trong ~/cm/src nhưng bạn có thể ghi đè bằng cách đặt biến môi trường GITREPO theo ý thích của bạn.

Tập lệnh này dựa trên this script.

37

Tôi khuyên bạn nên sử dụng công cụ lưu trữ nhiều mr. Tôi đã từng sử dụng tập lệnh shell tùy chỉnh theo đề xuất của người khác trong một khoảng thời gian, nhưng việc sử dụng mr có những lợi ích sau cho tôi:

  • Đó là chung: Không thể sử dụng kết hợp các hệ thống điều khiển phiên bản khác nhau ví dụ Mercurial, SVN, v.v.)
  • Nhanh: mr có thể thực thi nhiều công việc song song. Tôi sử dụng một số kho git/mercurial và đồng bộ chúng nhiều lần trong ngày. Anh ta tăng tốc quá trình này rất nhiều.
  • Thật dễ dàng và nhanh chóng để quản lý danh sách kiểm tra kho lưu trữ. Chỉ cần sử dụng 'mr register' thay vì sửa đổi danh sách các dự án trong kịch bản tùy chỉnh của bạn.

Về câu hỏi của bạn về đầu ra im lặng: Mức độ độ dài có thể được sửa đổi bằng cách sử dụng công tắc dòng lệnh -q. Tôi thích đầu ra mặc định xuất hiện để hợp nhất đầu ra một cách ngắn gọn và rõ ràng.

tôi sử dụng bí danh sau cho lệnh mr để đảm bảo mr luôn nhặt danh sách dự án mặc định của tôi được lưu trữ trong $ HOME, và sử dụng 5 đề song song:

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

Ứng dụng có hỗ trợ Windows không? –

+0

@FitzchakYitzchaki No: http://myrepos.branchable.com/install/ –

+0

thật tuyệt vời nhưng không hỗ trợ gắn thẻ git (tính đến năm 2016-08) –

4

gitslave là một công cụ mà có thể chạy cùng một lệnh trên nhiều kho lưu trữ bằng cách tạo mối quan hệ siêu dự án/tiểu dự án giữa siêu và người đăng ký. Điều này (theo mặc định) cung cấp tóm tắt đầu ra để bạn có thể tập trung vào các kho lưu trữ cung cấp đầu ra duy nhất (hữu ích cho trạng thái git, không hữu ích cho các tệp git ls).

Điều này thường được sử dụng cho các dự án mà bạn cần để tập hợp nhiều kho lưu trữ cùng nhau và giữ chúng trên cùng một chi nhánh hoặc thẻ cùng một lúc hoặc bất cứ điều gì. Đối với thư mục của tôi về kho (trần) tôi chỉ có một makefile ít mà cho phép tôi chạy lệnh git tùy ý, mà như bạn thấy tôi chủ yếu sử dụng cho fsck và 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 [email protected] || echo $$f FAILED); done 
9

Tôi phải nói rằng tôi bắt đầu với hiện chấp nhận Câu trả lời (chỉ là một loạt các kịch bản trợ giúp lặp lại trên các kho lưu trữ), nhưng tất cả trong tất cả, đó là một kinh nghiệm thiếu cho tôi. Vì vậy, sau khi cố gắng mr, repo và git-submodules, tôi thấy mỗi thiếu một cách khác nhau, vì vậy, tôi đã kết thúc làm biến thể của riêng tôi: http://fabioz.github.io/mu-repo là một công cụ trưởng thành vào thời điểm này, với quy trình công việc cho phép nhân bản nhiều repos, diffing (và chỉnh sửa) chúng, xem trước các thay đổi đến, vv

-1

https://github.com/wwjamieson3/envisionTools có một tập lệnh bash gọi là gitstat thực hiện điều này và nhiều hơn thế nữa. Đó là GNU và mac tương thích. Nó có thể thực hiện tìm nạp từ điều khiển từ xa nếu được hỏi. Nó hiển thị các tập tin không được theo dõi, sửa đổi, thêm, xóa và dàn dựng. Nó khác biệt với điều khiển từ xa bằng cách hiển thị các cam kết chưa được kết hợp trên điều khiển từ xa và các cam kết cục bộ chưa được làm sạch. Nó cũng có thể hiển thị các kết quả được mã hóa màu ở chế độ tóm tắt hoặc chi tiết và thậm chí là HTML. Nó sử dụng định vị thay vì tìm vì nó nhanh hơn và thậm chí sẽ nhắc cập nhật cơ sở dữ liệu định vị của bạn nếu nó quá cũ.

+2

Cảm ơn bạn đã đăng câu trả lời! Vui lòng đảm bảo đọc kỹ [FAQ on Self-Promotion] (http://stackoverflow.com/faq#promotion). Cũng lưu ý rằng nó là * bắt buộc * mà bạn đăng tuyên bố từ chối trách nhiệm mỗi lần bạn liên kết đến trang web/sản phẩm của riêng bạn. –

+3

Thật không may, liên kết github wwjamieson3/envisionTools bị hỏng. –

+0

@williamJamieson là envisionTools là kho lưu trữ GitHub riêng tư? – eebbesen

9

gr (git-run) mở rộng chức năng của mr (chỉ dành cho git). Tôi tìm thấy nó dễ dàng hơn để tổ chức nhiều repo git bằng cách sử dụng hệ thống thẻ của nó. Mã cho gr không được duy trì tốt mặc dù. Nếu bạn đang sử dụng bash, hãy đảm bảo bạn sử dụng nó với -t tag thay vì biểu mẫu #tag.

+0

Có vẻ như quá trình phát triển đã tăng trở lại một chút kể từ đó: https://github.com/mixu/gr/graphs/contributors –

0

Nếu ai vẫn nhìn vào chủ đề này xin vui lòng kiểm shell script của tôi gọi gitme

bạn sẽ cần phải tự đầu vào Repos git địa phương của bạn, nhưng tôi sử dụng công cụ hàng ngày này để cộng tác nhiều dự án git trên nhiều máy tính.

bạn có thể chạy git clone https://github.com/robbenz/gitme.git

cũng là kịch bản được đăng tải dưới đây

#!/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 

tôi thiết lập một bí danh trong tôi ~/.bash_profile để alias gitme='sh /path/to/gitme.sh'

1

Tôi vừa tạo ra một công cụ mà làm gì bạn muốn!

  1. Tôi làm cách nào để tìm nạp tất cả chúng? gmaster fetch
  2. Làm cách nào để kiểm tra xem liệu có bất kỳ thay đổi nào không được cam kết không? gmaster status
  3. Làm cách nào để kiểm tra xem có bất kỳ thay đổi nào để hợp nhất không? gmaster status

Nó được gọi là gitmaster: https://github.com/francoiscabrol/gitmaster

2

Bạn có thể sử dụng git-status-all đá quý cho việc này: 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 

Ngoài ra còn có một tùy chọn đó sẽ lấy từ nguồn gốc cho tất cả các kho trước khi lấy hiển thị trạng thái:

git status-all --fetch 

git status all

+1

Cách tiếp cận rất hay. Ngược lại với hầu hết các công cụ bình chọn cao hơn, không cần phải đăng ký kho lưu trữ đầu tiên, thay vào đó nó chỉ cần kiểm tra tất cả các thư mục con. – luator

Các vấn đề liên quan