การจัดการที่เก็บ git จำนวนมาก


88

การตั้งค่าโปรเจ็กต์ทำได้ง่ายในคอมไพล์ดังนั้นฉันจึงสามารถมีที่เก็บแยกต่างหากแม้กระทั่งสำหรับสคริปต์ขนาดเล็ก ตอนนี้ปัญหาคือจะจัดการอย่างไร

ฉันทำงานในหลายที่ด้วยที่เก็บเหล่านี้ เมื่อฉันทำการเปลี่ยนแปลงที่เก็บบางส่วนฉันต้องการที่จะอัปเดตที่เก็บในที่อื่น ๆ

ดังนั้นฉันจึงมีไดเร็กทอรีที่มีที่เก็บมากมายอยู่ในนั้น

  1. ฉันจะดึงข้อมูลทั้งหมดได้อย่างไร
  2. ฉันจะตรวจสอบได้อย่างไรว่ามีการเปลี่ยนแปลงที่ไม่ได้ผูกมัดหรือไม่
  3. ฉันจะตรวจสอบได้อย่างไรว่ามีการเปลี่ยนแปลงใด ๆ ในการรวมหรือไม่

และจะเป็นการดีที่สามารถทำได้ด้วยคำสั่งเดียว

ผลลัพธ์ต้องเงียบพอที่จะสังเกตเห็นสิ่งที่ต้องทำจริงๆ


คำถามเดียวกันตอบhg mercurialสำหรับ
Serge Stroobandt

ฉันใช้คุณสมบัติการแก้ไขหลายเคอร์เซอร์เลือก / หลายบรรทัดของโปรแกรมแก้ไขโค้ดของฉัน (รหัส VS) เพื่อสร้างแบทช์ / เชลล์สคริปต์และดำเนินการได้ในครั้งเดียว ด้วยวิธีแก้ปัญหาโง่ ๆ ง่ายๆนี้ฉันรู้ว่าฉันกำลังทำอะไรและคาดหวังอะไรจากการดำเนินการตามคำสั่ง ไม่ต้องเดาไม่ต้องเรียนรู้ไม่จำเป็นต้องปรับแต่ง อีกเหตุผลหนึ่งคือทุกครั้งที่ฉันต้องการเรียกใช้คำสั่งในชุด repos ที่แตกต่างกันซึ่งอยู่ในไดเร็กทอรีหลักทั่วไป
IsmailS

คำตอบ:


45

ผมขอแนะนำเครื่องมือหลายที่เก็บนาย ฉันเคยใช้เชลล์สคริปต์แบบกำหนดเองตามที่คนอื่นแนะนำมาระยะหนึ่งแล้ว แต่การใช้ mr มีประโยชน์ต่อฉันดังต่อไปนี้:

  • เป็นเรื่องทั่วไป: สามารถใช้ระบบควบคุมเวอร์ชันต่างๆร่วมกันได้ไม่เพียง แต่คอมไพล์ (เช่น Mercurial, SVN เป็นต้น)
  • รวดเร็ว: mr สามารถทำงานหลาย ๆ งานพร้อมกันได้ ฉันใช้ที่เก็บ git / mercurial จำนวนมากและซิงค์หลายครั้งต่อวัน Mr เร่งกระบวนการนี้อย่างมาก
  • ง่ายและรวดเร็วในการจัดการรายการเช็คเอาต์ที่เก็บ เพียงใช้ 'mr register' แทนที่จะแก้ไขรายการโครงการในสคริปต์ที่คุณกำหนดเอง

เกี่ยวกับคำถามของคุณเกี่ยวกับเอาต์พุตแบบไม่โต้ตอบ: ระดับของการใช้คำฟุ่มเฟือยสามารถแก้ไขได้โดยใช้สวิตช์บรรทัดคำสั่ง -q ฉันชอบเอาท์พุทเริ่มต้นที่ดูเหมือนจะรวมเอาท์พุทเข้าด้วยกันเป็นอย่างดีโดยสรุปสั้น ๆ และชัดเจน

ฉันใช้นามแฝงต่อไปนี้สำหรับคำสั่ง mr เพื่อให้แน่ใจว่า mr หยิบรายการโปรเจ็กต์เริ่มต้นของฉันที่เก็บไว้ใน $ HOME เสมอและใช้ 5 เธรดคู่ขนาน:

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

มันเยี่ยมมาก แต่ไม่รองรับการติดแท็ก git (ณ วันที่ 2016-08)
Hugo Zaragoza

@CADbloke ไม่ได้กล่าวถึง windows ในหน้าการติดตั้ง แต่เป็นสคริปต์ Perl มันอาจ / ควร / สามารถทำงานบน windows ได้
scipilot

2
@HugoZaragoza คุณสามารถกำหนดคำสั่งนี้ได้ด้วยตัวเอง [DEFAULT] tag = git tag "$ @"
AlexS

2
alias pa='find . -name .git -print -execdir git pull \;'แล้วpaก็เพียงพอแล้ว
DawnSong

20

ฉันต้องบอกว่าฉันเริ่มต้นด้วยคำตอบที่ยอมรับในปัจจุบัน (มีเพียงสคริปต์ผู้ช่วยจำนวนหนึ่งที่วนซ้ำบนที่เก็บ) แต่สรุปแล้วมันเป็นประสบการณ์ที่ขาดไปสำหรับฉัน

ดังนั้นหลังจากลองใช้ mr, repo และ git-submodules ฉันพบว่าแต่ละรายการขาดในลักษณะที่แตกต่างกันดังนั้นฉันจึงทำตัวแปรของตัวเอง: http://fabioz.github.io/mu-repoซึ่งเป็นเครื่องมือสำหรับผู้ใหญ่ที่ จุดนี้ - มีเวิร์กโฟลว์ที่ช่วยให้คุณ:

  • โคลนหลาย repos
  • แตกต่าง (และแก้ไข) การเปลี่ยนแปลงปัจจุบันในหลาย repos
  • ดูตัวอย่างการเปลี่ยนแปลงที่เข้ามา
  • เรียกใช้คำสั่งในหลาย repos พร้อมกัน
  • สร้างกลุ่มของ repos
  • เรียกใช้คำสั่งที่ไม่เกี่ยวข้องกับคอมไพล์บนหลาย repos
  • ฯลฯ (ดูหน้าแรกสำหรับข้อมูลเพิ่มเติม)

โปรดทราบว่ารองรับระบบปฏิบัติการใด ๆ ที่ Python ทำงาน;)


คำตอบของคุณแนะนำว่า mu-repo ดีกว่าที่ mr ทำ แต่ mu-repo ไม่รองรับ repos ที่ไม่ใช่ git
Shaunak Sontakke

1
อย่างไรก็ตามมันมีจุดประสงค์เพื่อรองรับ git repos เท่านั้น (ซึ่งเป็นคำถามที่ถาม) - แม้ว่าคุณจะสามารถmu sh <some command>ดำเนินการคำสั่งตามอำเภอใจในหลาย repos ได้เช่นกัน แต่ตอนจบทั้งหมดนั้นเกี่ยวข้องกับ git ไม่ใช่ระบบควบคุมเวอร์ชันอื่น ๆ หากคุณต้องการสิ่งนั้นใช่โปรดใช้เครื่องมืออื่น
Fabio Zadrozny

14

gr (git-run) ขยายฟังก์ชันการทำงานของ mr (สำหรับgit) ฉันพบว่าการจัดระเบียบ git repos หลาย ๆ ตัวโดยใช้ระบบแท็กนั้นง่ายกว่า รหัสสำหรับgrไม่ได้รับการดูแลอย่างดีแม้ว่า หากคุณใช้ bash ตรวจสอบให้แน่ใจว่าคุณใช้-t tagแทน#tagแบบฟอร์ม


ดูเหมือนว่าการพัฒนาจะกลับมาอีกเล็กน้อยตั้งแต่นั้นมา: github.com/mixu/gr/graphs/contributors
Dave Forgac

8

คุณสามารถลองใช้repoกับmanifest.xmlไฟล์ที่กำหนดเองเพื่อระบุว่าที่เก็บของคุณอยู่ที่ไหน มีเอกสารเกี่ยวกับวิธีการทำเช่นนี้

หรือคุณสามารถใช้)git-submodule(1


2
git-submodule จะดีถ้าฉันต้องการให้ที่เก็บอยู่ในสถานะเดียวกัน แต่นั่นไม่เป็นเช่นนั้น ชุดของที่เก็บไม่เหมือนกันในแต่ละที่ อาจมีการเปลี่ยนแปลงที่ไม่ได้ผูกมัด อาจมีการเปลี่ยนแปลงที่ฉันยังไม่ต้องการรวม
2552 เวลา 09:44 น

ฉันไม่รู้เกี่ยวกับ git-submodule ขอบคุณที่กล่าวถึง
sykora

เอกสารสำหรับ repo ค่อนข้างน้อยและดูเหมือนว่ามีไว้สำหรับขั้นตอนการทำงานประเภทต่างๆที่ฉันต้องการใช้
iny

6

ฉันเขียนเครื่องมือที่เรียกว่า " RepoZ " ซึ่งจะค้นพบที่เก็บ git โดยอัตโนมัติทันทีที่คุณโคลนหรือเปลี่ยนแปลงอะไรก็ตามในนั้นเช่นการสลับสาขาเป็นต้น

เมื่อพบแล้วที่เก็บจะ "ติดตาม" นั่นก็จะแสดงให้พวกเขาในรายการของที่เก็บในท้องถิ่นรวมทั้งข้อมูลสถานะหนาแน่นแรงบันดาลใจจากหรู-คอมไพล์ ซึ่งประกอบด้วยสาขาปัจจุบันและข้อมูลเพิ่มเติมเช่นการแก้ไขไฟล์และจำนวนคอมมิตขาเข้าหรือขาออก

RepoZ UI

สิ่งนี้ช่วยในการติดตามที่เก็บในเครื่องของคุณและงานที่ยังไม่เสร็จเพื่อกระทำหรือผลักดัน นอกจากนี้คุณสามารถใช้รายการที่เก็บเป็นการนำทางเพื่อสลับจากที่เก็บหนึ่งไปยังอีกที่เก็บ

การนำทาง RepoZ

"ฉันจะดึงข้อมูลทั้งหมดได้อย่างไร"

เวอร์ชันสำหรับ Windows มีเมนูบริบทเพื่อดึงหรือดึงที่เก็บ ด้วยการเลือกหลายรายการคุณสามารถเรียกใช้การดำเนินการกับที่เก็บหลายรายการพร้อมกัน

อย่างไรก็ตามคุณอาจพบว่าคุณสมบัติอื่นที่มีประโยชน์มาก:

RepoZ Auto-Fetch

ด้วยการดึงข้อมูลอัตโนมัติคุณสามารถบอกให้ RepoZ ดึงรีโมตของที่เก็บ git ทั้งหมดของคุณเป็นระยะ ๆ ในพื้นหลัง การดึงข้อมูลเหล่านี้จะไม่ชนกับการกระทำในพื้นที่ของคุณแน่นอน git pullไม่มีความพยายามในการผสานท้องถิ่นเช่นเดียวกับการมี


ใช่แย่เกินไปและไม่สมควรได้รับ เปิดรับ PR ตลอดเวลา ปิงฉัน
Waescher

5

gitslaveเป็นเครื่องมือที่สามารถรันคำสั่งเดียวกันบนที่เก็บข้อมูลจำนวนมากโดยการสร้างความสัมพันธ์ระหว่าง superproject / subproject ระหว่าง super และ subs สิ่งนี้ (โดยค่าเริ่มต้น) จัดเตรียมการสรุปเอาต์พุตเพื่อให้คุณสามารถมุ่งเน้นไปที่ที่เก็บซึ่งให้เอาต์พุตที่ไม่ซ้ำกัน (มีประโยชน์สำหรับสถานะคอมไพล์ซึ่งไม่มีประโยชน์สำหรับ git ls-files)

โดยทั่วไปจะใช้สำหรับโปรเจ็กต์ที่คุณจำเป็นต้องรวบรวมที่เก็บหลาย ๆ ที่เข้าด้วยกันและเก็บไว้ในสาขาหรือแท็กเดียวกันในเวลาเดียวกันหรืออะไรก็ตาม สำหรับไดเร็กทอรีของที่เก็บ (เปล่า) ฉันมี makefile เพียงเล็กน้อยซึ่งให้ฉันรันคำสั่ง 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

เพ้อเจ้อ! หนึ่งซับง่ายๆในการใส่.bash_aliases: alias rgit='function _rgit(){ find . -type d -name .git -printf "\n%p\n" -execdir git "$@" \;; }; _rgit'. ที่มาแล้วเช่นโทรrgit status.
ford04

4

คุณสามารถใช้git-status-allอัญมณีสำหรับสิ่งนี้: 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

git สถานะทั้งหมด


1
แนวทางที่ดีมาก ตรงกันข้ามกับเครื่องมือที่ได้รับการโหวตที่สูงกว่าส่วนใหญ่ไม่จำเป็นต้องลงทะเบียนที่เก็บก่อน แต่เพียงแค่ตรวจสอบไดเรกทอรีย่อยทั้งหมด
luator

find . -name .git -print -execdir git status \;ไม่เป็นไร
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

ตามค่าเริ่มต้นสคริปต์จะค้นหาที่เก็บ git ใน ~ / cm / src แต่คุณสามารถแทนที่สิ่งนี้ได้โดยตั้งค่าตัวแปรสภาพแวดล้อม GITREPO ตามที่คุณต้องการ

สคริปต์นี้อ้างอิงจากสคริปต์นี้นี้


find . -name .git -print -execdir git pull \;ทำในสิ่งที่คุณคิด
DawnSong

3

ฉันเขียนเครื่องมือ commandline ชื่อgitaเพื่อจัดการ repos หลาย ๆ มันแสดงสถานะของ repos ที่ลงทะเบียนเคียงข้างกันเช่น

ใส่คำอธิบายภาพที่นี่

นอกจากนี้ยังสามารถมอบหมายคำสั่ง git / นามแฝงจากไดเร็กทอรีการทำงานใด ๆ

ตอนนี้เพื่อตอบคำถามของคุณโดยใช้เครื่องมือนี้:

ฉันจะดึงข้อมูลทั้งหมดได้อย่างไร

gita fetch

ฉันจะตรวจสอบได้อย่างไรว่ามีการเปลี่ยนแปลงที่ไม่ได้ผูกมัดหรือไม่

gita lsสัญลักษณ์คำสั่งแสดงให้เห็นว่าเป็นไปได้ที่ 3 ถัดจากชื่อสาขาซึ่งบ่งชี้ว่า

  • +: การเปลี่ยนแปลงตามขั้นตอน
  • *: การเปลี่ยนแปลงที่ไม่มีขั้นตอน
  • _: ไฟล์ / โฟลเดอร์ที่ไม่ถูกติดตาม

ฉันจะตรวจสอบได้อย่างไรว่ามีการเปลี่ยนแปลงใด ๆ ในการรวมหรือไม่

ชื่อสาขามี 5 วิธี

  • สีขาว: สาขาในพื้นที่ไม่มีสาขาห่างไกล
  • สีเขียว: สาขาท้องถิ่นเหมือนกับสาขาที่อยู่ห่างไกล
  • สีแดง: สาขาท้องถิ่นแตกต่างจากสาขาห่างไกล
  • สีม่วง: สาขาในพื้นที่อยู่ข้างหน้าสาขาห่างไกล (เหมาะสำหรับการผลักดัน)
  • สีเหลือง: สาขาในพื้นที่อยู่หลังสาขาห่างไกล (เหมาะสำหรับการรวม)

ในการติดตั้งเพียงเรียกใช้

pip3 install -U gita

2

หากใครยังคงดูหัวข้อนี้โปรดตรวจสอบเชลล์สคริปต์ของฉันที่ชื่อว่า gitme

คุณจะต้องป้อน git repos ในพื้นที่ของคุณด้วยตนเอง แต่ฉันใช้เครื่องมือนี้ทุกวันเพื่อทำงานร่วมกันหลายโครงการ 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

คุณควรตรวจสอบrgitบน CPAN ซึ่งเรียกใช้คำสั่ง git ซ้ำในที่เก็บทั้งหมดในแผนผังไดเรกทอรี

จากเอกสาร:

ยูทิลิตี้นี้จะค้นหาซ้ำในไดเร็กทอรีรูท (ซึ่งอาจเป็นไดเร็กทอรีการทำงานปัจจุบันหรือ - หากมีการตั้งค่า - ไดเร็กทอรีที่กำหนดโดยตัวแปรสภาวะแวดล้อม GIT_DIR) สำหรับที่เก็บ git ทั้งหมดจัดเรียงรายการนี้ตามพา ธ ที่เก็บ chdir ในแต่ละ และรันคำสั่ง git ที่ระบุ


1

ฉันเพิ่งสร้างเครื่องมือที่ทำในสิ่งที่คุณต้องการ!

  1. ฉันจะดึงข้อมูลทั้งหมดได้อย่างไร gmaster fetch
  2. ฉันจะตรวจสอบได้อย่างไรว่ามีการเปลี่ยนแปลงที่ไม่ได้ผูกมัดหรือไม่ gmaster status
  3. ฉันจะตรวจสอบได้อย่างไรว่ามีการเปลี่ยนแปลงใด ๆ ในการรวมหรือไม่ gmaster status

เรียกว่า gitmaster: https://github.com/francoiscabrol/gitmaster


1

ฉันเขียนฟังก์ชัน bash ง่ายๆนี้ลงใน. bash_profile ของฉันเพื่อให้สามารถรัน git, maven, gradle หรือคำสั่ง bash อื่น ๆ ในที่เก็บ git ทั้งหมดเท่านั้น:

# 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.

เราสามารถเรียกใช้ทั้งหมดแบบขนานโดยใช้: all './gradlew clean test &'
ChaudPain

0

ข้อจำกัดความรับผิดชอบ: ฉันกำลังทำงานกับเครื่องมือนี้ที่www.repoflow.com

ฉันจะดึงข้อมูลทั้งหมดได้อย่างไร
ฉันจะตรวจสอบได้อย่างไรว่ามีการเปลี่ยนแปลงใด ๆ ในการรวมหรือไม่

  • คุณสามารถดึงข้อมูลที่เก็บทั้งหมดที่เกี่ยวข้อง (หรือ push / pull / commits) หลังจากการดึงข้อมูล 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 ลูก (ในกรณีตัวอย่างด้านบนและsuper-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 เรามีไลบรารีประมาณ 20 ไลบรารีใน codebase ของเราซึ่งเป็น Git repos ที่แยกจากกันทั้งหมดและแท็บการควบคุมแหล่งที่มาใน Visual Studio Code นั้นค่อนข้างดีสำหรับการดูมุมมอง "โดยย่อ" ว่า repos ในเครื่องอยู่ไกลแค่ไหน นอกจากนี้ยังมีการตั้งค่าในการดึงข้อมูลเป็นระยะ ๆ เพื่อให้ข้อมูลนั้นเป็นปัจจุบันตลอดจนปุ่มรีเฟรช

มันไม่สะดวกเท่าสคริปต์ แต่เมื่อพูดถึงการควบคุมแหล่งที่มาสำหรับฉันฉันชอบที่จะเป็นคนทำการเปลี่ยนแปลง ต้องใช้ความระมัดระวังในการเขียนสคริปต์ที่ดีมากที่จะไม่เขียนทับการเปลี่ยนแปลง ฯลฯ ด้วยวิธี VS Code คุณจะได้รับข้อมูลจำนวนมากอย่างรวดเร็วเพื่อให้คุณดำเนินการกับตัวเองได้

นี่คือภาพหน้าจอของสิ่งที่ดูเหมือน:

หน้าต่างควบคุมแหล่งที่มาใน VS Code


0

ฉันพบวิธีแก้ปัญหาที่ยอดเยี่ยมสำหรับการดึงจากสาขาปัจจุบันจากไดเรกทอรีย่อยทั้งหมดที่มีโฟลเดอร์. git แม้ว่าแต่ละ repo จะมีการเลือกสาขาที่แตกต่างกัน คำสั่งเป็นแบบซับเดียวมีความยืดหยุ่นเพียงพอที่จะแก้ไขสำหรับคำสั่ง 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 

ค้นหาไดเร็กทอรีทั้งหมด (-type d) ในไดเร็กทอรีปัจจุบัน (find.) ที่มีชื่อ ".git" (-name .git) โดยมองหาไดเร็กทอรีสูงสุดสองไดเร็กทอรีลึก (2 แทนที่จะเป็น 1 เนื่องจากเรากำลังมองหา git โฟลเดอร์ภายในโฟลเดอร์ git repo)

-exec sh -c 

รันคำสั่งเชลล์ต่อไปนี้ (exec sh -c)

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

เปลี่ยนไดเร็กทอรีเป็นอาร์กิวเมนต์แรก (cd $ 0) จากนั้นเปลี่ยนไดเร็กทอรีหนึ่งระดับขึ้นไปเพื่อออกจากโฟลเดอร์. git (cd .. ) จากนั้นทำ git pull origin ในขณะที่ระบุสาขาโดยเรียกใช้ git rev-parse ... สำหรับสาขาปัจจุบัน HEAD คอมมิต

{} \;

"{}" คือเส้นทางสัมพัทธ์ของผลลัพธ์ที่เราได้รับจากคำสั่งค้นหาเริ่มต้น ที่; ใช้เพื่อสิ้นสุดคำสั่ง

ทดสอบบน MacOS 10.14.6 บน zsh ตามที่เป็นอยู่จะใช้งานได้เฉพาะเมื่อสาขาที่อยู่ห่างไกลและในพื้นที่มีชื่อเหมือนกันว่า AFAIK

คุณสามารถแก้ไขสิ่งนี้เพื่อรับสถานะ ฉันคาดว่าคุณอาจจะสามารถเพิ่มข้อโต้แย้งเพื่อให้มีความยืดหยุ่นมากขึ้น แต่ฉันยังไม่ได้ลอง


0

ฉันใช้คุณสมบัติการแก้ไขหลายเคอร์เซอร์เลือก / หลายบรรทัดของโปรแกรมแก้ไขโค้ดของฉัน (รหัส VS) เพื่อสร้างแบทช์ / เชลล์สคริปต์และดำเนินการได้ในครั้งเดียว ด้วยวิธีแก้ปัญหาโง่ ๆ ง่ายๆนี้ฉันรู้ว่ากำลังทำอะไรและคาดหวังอะไรได้บ้างจากการดำเนินการตามคำสั่งเหล่านั้น ไม่ต้องเดาไม่ต้องเรียนรู้ไม่จำเป็นต้องปรับแต่ง อีกเหตุผลหนึ่งคือทุกครั้งที่ฉันต้องการเรียกใช้คำสั่งในชุด repos ที่แตกต่างกันซึ่งอยู่ในไดเร็กทอรีหลักทั่วไป


-1

https://github.com/wwjamieson3/envisionToolsมีสคริปต์ bash ที่เรียกว่า gitstat ที่ทำสิ่งนี้และอื่น ๆ อีกมากมาย มันเข้ากันได้กับ GNU และ mac สามารถทำการดึงข้อมูลจากรีโมทได้หากถูกถาม จะแสดงไฟล์ที่ไม่ได้ติดตามแก้ไขเพิ่มลบและจัดฉาก มันแตกต่างกับรีโมตโดยแสดงการคอมมิตที่ไม่ได้ผสานกับรีโมตและคอมมิตในเครื่องที่ไม่ได้เสียบ นอกจากนี้ยังสามารถแสดงผลรหัสสีในโหมดสรุปหรือโหมดรายละเอียดและแม้แต่ HTML ใช้ locate แทนการค้นหาเพราะเร็วกว่าไม่สิ้นสุดและจะแจ้งให้อัปเดตฐานข้อมูลค้นหาตำแหน่งของคุณหากเก่าเกินไป


2
ขอบคุณสำหรับการโพสต์คำตอบของคุณ! โปรดอ่านคำถามที่พบบ่อยเกี่ยวกับการส่งเสริมตนเองอย่างละเอียด โปรดทราบว่าคุณจำเป็นต้องโพสต์ข้อจำกัดความรับผิดชอบทุกครั้งที่คุณเชื่อมโยงไปยังไซต์ / ผลิตภัณฑ์ของคุณเอง
Andrew Barber

3
ขออภัยลิงก์ github wwjamieson3 / envisionTools เสีย
Brenda J. Butler

@williamJamieson envisionTools เป็นที่เก็บ GitHub ส่วนตัวหรือไม่?
eebbesen

-5

ดูเหมือนการเขียนสคริปต์ในการทำจะค่อนข้างง่าย โดยพื้นฐานแล้วจะต้องวนซ้ำบนที่เก็บจากนั้นใช้คำสั่งเช่น git ls-files, git diff และ git log


ฉันรู้ว่ามันสายไปแล้ว แต่คุณสามารถเผยแพร่สคริปต์ได้ไหม
l0b0

ไม่มี "สคริปต์" ฉันใช้สคริปต์ที่ฉันเขียนขึ้นเพื่อความต้องการของตัวเอง แต่ไม่ใช่สคริปต์ทั่วไป
iny

"git diff" เป็นเรื่องยุ่งยากหากคุณต้องการได้ไฟล์ diff ไฟล์เดียวที่สามารถเปลี่ยนกลับและนำไปใช้ใหม่ได้ด้วยคำสั่ง patch เดียว
proski

4
คำตอบใด ๆ ที่แท้จริงควรเป็นคำตอบที่ยอมรับ แต่เป็นคำตอบนี้
Kennet Celeste
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.