ฉันจะดูที่เก็บ git ทั้งหมดบนเครื่องของฉันได้อย่างไร


121

มีวิธีใดบ้างที่ฉันสามารถดูที่เก็บ git ทั้งหมดที่มีอยู่ในเครื่องของฉันได้ คำสั่งใด ๆ สำหรับสิ่งนั้น?


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

@ cagliari2005: แล้วที่เก็บเปล่าล่ะ? stackoverflow.com/questions/60064170/…
Luciano

คำตอบ:


102

หากคุณอยู่ใน Linux find / -name ".git"ไม่เช่นนั้นจะไม่มีทางเป็นไดเร็กทอรีมาตรฐานเพียงแค่ใช้โปรแกรมค้นหาไฟล์ / โฟลเดอร์ OS ของคุณเพื่อค้นหา.gitโฟลเดอร์ที่มีชื่อ


1
ใน Windows (และฉันแน่ใจว่า Mac ด้วย) คุณสามารถทำสิ่งที่คล้ายกันได้ ... เพียงแค่ค้นหาไดเรกทอรีชื่อ. git - ซึ่งเป็นสิ่งที่ git ใช้ในการจัดเก็บข้อมูลเมตา
cjstehno

3
สำหรับ Mac คำสั่งด้านบนก็ใช้ได้เช่นกัน (เว้นแต่คุณจะใช้ OS9 หรือ
เก่า

1
เชลล์สคริปต์ที่ดีหรือแอ็พพลิเคชันยูทิลิตี้ขนาดเล็กที่ใช้ฟังก์ชันการค้นหาไฟล์แบบง่ายนี้และเพิ่มข้อมูลสถานะที่เก็บในรายการหรือไม่ ไม่ควรเป็นปัญหาในการเขียนเชลล์สคริปต์เพื่อทำเช่นนั้น แต่ควรใช้สคริปต์ที่ได้รับการยอมรับมาเป็นอย่างดีมากกว่าการแฮ็กที่ไม่ได้เพิ่มประสิทธิภาพของฉันเอง
jmlane

6
@jmlanefor d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
LJ VanKuiken

หาคนหน้ามีวิธีแก้ คล้ายกับคำตอบที่ยอมรับ แต่ใช้ -prune เพื่อให้กลับมาเร็วขึ้นโดยไม่ต้องเข้าไปในไดเร็กทอรี. git หากไม่มีการค้นหาลูกพรุนจะเข้าไปในโฟลเดอร์. git และขึ้นอยู่กับเนื้อหาที่ใช้เวลาค้นหาภายในโดยไม่จำเป็น โซลูชันหน้า Man ตามหลัง "find repo / (-exec test -d '{}' /. svn \; -or \ -exec test -d {} /. git \; -or -exec test -d {} / CVS \ ;) \ -print -prune ลองดูสิแก้ไข svn และ cvs ถ้าไม่จำเป็น
quiet_penguin

38

คำตอบดั้งเดิม : ใช้งานได้ดีจาก Windows Powershell:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Include ".git" -Recurse

แก้ไข # 1 : - ตัวกรองเร็วกว่า -Include ถึงสองเท่า นี่คือวิธีแก้ปัญหา:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse

แก้ไข # 2 : Keith E. Truesdellกล่าวถึงการส่งเอาต์พุตไปยังไฟล์ ดูความคิดเห็นของเขาสำหรับวิธีแก้ปัญหานั้น ฉันชอบเอาท์พุทคอนโซล แต่ความคิดเห็นของเขาทำให้ฉันคิดว่าฉันชอบแค่เส้นทางเต็มไม่ใช่ความยุ่งเหยิงทั้งหมดที่ถูกส่งกลับโดยค่าเริ่มต้น หากคุณต้องการแค่เส้นทางแบบเต็มให้ใช้สิ่งต่อไปนี้:

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.FullName }

FINAL หมายเหตุ : โซลูชั่นดังกล่าวข้างต้นเท่านั้นกลับเก็บ Git ภายใต้ไดเรกทอรีปัจจุบัน หากคุณต้องการที่เก็บทั้งหมดในไดรฟ์คุณควรรันคำสั่งหนึ่งครั้งจากรูทของแต่ละไดรฟ์


1
มีประโยชน์มากสำหรับผู้ใช้ windows! :)
Felix Feliciant

2
Get-ChildItem: ไม่พบพารามิเตอร์ที่ตรงกับชื่อพารามิเตอร์ 'Attributes' ที่บรรทัด: 1 ถ่าน: 28
Dewald Swanepoel

@DewaldSwanepoel - ฉันไม่รู้ว่าทำไมคุณถึงเห็นข้อผิดพลาดเกี่ยวกับพารามิเตอร์ Attributes เห็นได้ชัดว่าอยู่ในเอกสารและฉันได้ลองใช้กับ Windows / PowerShell หลายเวอร์ชันแล้ว Windows 7, 8 และ 10 ทั้งหมดทำงานร่วมกับ PowerShell เวอร์ชันต่างๆสำหรับฉัน หากคุณพบว่าเหตุใดจึงเกิดข้อผิดพลาดโปรดแบ่งปันที่นี่เพื่อให้เราได้เรียนรู้:>)
bopapa_1979

2
@DewaldSwanepoel - คุณสามารถอัปเกรดเวอร์ชัน PowerShell ได้อย่างแน่นอน เราทำด้วยช็อกโกแลต ฉันกำลังใช้งาน PowerShell เวอร์ชัน 5.0 บน Windows 7 ในที่ทำงาน
bopapa_1979

1
@ KeithE.Truesdell - ฉันค่อนข้างมั่นใจว่าแอตทริบิวต์ "Directory + Hidden" รวมอยู่ด้วยและจะค้นหาเฉพาะไดเรกทอรีเท่านั้น การเพิ่ม -Directory ของฉันเร็วกว่าใน PowerShell เวอร์ชันใหม่กว่า ฉันจะไปเวลามัน แก้ไข - การเพิ่ม "-Directory" จะไม่มีความแตกต่างที่เป็นสาระสำคัญเนื่องจากเอกสารจะระบุ อย่างไรก็ตามการเพิ่ม Directory Attribute ตามที่คุณแนะนำจะทำให้ช้าลง ตอนนี้ฉันมีความคิดว่าทำไม แต่ฉันทดสอบทั้งสองวิธีด้วย Measure-Command และทั้งสามแบบที่มีแอตทริบิวต์ Directory เพิ่มเติมนั้นช้ากว่าทั้งสามแบบที่ไม่มี
bopapa_1979

18

ใน * nix สิ่งนี้จะพบที่--bareเก็บใด ๆ

find / -name "*.git" -type d

3
ที่เก็บเปล่าไม่จำเป็นต้องตั้งชื่อname.gitนั่นเป็นเพียงแบบแผนตัวอย่างเช่นฉันไม่ปฏิบัติตาม
Arkaitz Jimenez

3
เนื่องจากที่เก็บเปล่าไม่จำเป็นต้องเป็นไปตามหลักการตั้งชื่อนั้นมีวิธีสากลสำหรับfindrepos เหล่านั้นหรือไม่?
jmlane

11

เก็บ Git ทุกคนมีHEAD,refsและobjectsรายการ

ใน GNU / อะไรก็ได้

find -name HEAD -execdir test -e refs -a -e objects \; -printf %h\\n

เพียงแค่ตรวจสอบ .gitจะพลาด repos และโมดูลย่อยที่เปลือยเปล่ามากมาย

หากต้องการหวาดระแวงอย่างเต็มที่ในการตรวจสอบคุณสามารถขอให้ git ทำการตรวจสอบทั้งหมดของตัวเองก่อนพิมพ์

find -name HEAD -execdir test -e refs -a -e objects \; \
      -execdir sh -ec 'GIT_DIR=$PWD git rev-parse --absolute-git-dir 2>&-' \;

(แก้ไข: ฉันคิดว่า.git/configไฟล์นั้นจำเป็น แต่ไม่ใช่ดังนั้นขั้นต่ำที่แน่นอนgit init newrepoคือ

mkdir -p newrepo/.git/{objects,refs}
echo ref: refs/heads/master >newrepo/.git/HEAD

)



3

บน Linux และ OS X คำสั่งต่อไปนี้อาจเร็วที่สุด (ละเว้นที่เก็บที่ไม่มี.git) เมื่อไดเร็กทอรีรากของfindคือ/:

find / -name .git -exec dirname {} \; -prune

แต่สำหรับรูทที่มีที่เก็บส่วนใหญ่อยู่ด้านล่างสิ่งต่อไปนี้น่าจะเร็วที่สุด (คุณอาจต้องการแทนที่/ด้วย.หรือรูทอื่น):

find / -type d -exec test -d {}/.git \; -prune -print

คำอธิบายโดยย่อเกี่ยวกับไพรมารีของการfindใช้งาน (เนื่องจากไม่มีตัวดำเนินการอยู่ที่นี่-andจึงเป็นนัยกล่าวคือสำหรับไพรมารีโหนดที่เยี่ยมชมแต่ละรายการจะได้รับการประเมินจากซ้ายไปขวาจนกว่าหนึ่งในนั้นจะประเมินเป็นfalse):

  • -nameคือtrueถ้าชื่อตรงกัน (บ่อยครั้ง แต่ไม่ใช่ที่นี่โดยใช้สัญลักษณ์แทน)
  • -execเรียกใช้คำสั่งที่สิ้นสุดโดย;(ซึ่งถูก\หลีกเลี่ยงเพื่อหลีกเลี่ยงการตีความโดยเชลล์) และtrueถ้าสถานะการส่งคืนเป็น0(กล่าวคือตกลง) โหนดปัจจุบันพร้อมใช้งานเป็น{}(ซึ่งไม่จำเป็นต้องหลบหนี)
  • -pruneอยู่เสมอtrueและทำให้โหนดลูกทั้งหมดถูกข้ามไป
  • -type dเป็นtrueไดเรกทอรี
  • -printเป็นสิ่งจำเป็นที่นี่เพราะหาก-execมีอยู่จะไม่มีการต่อท้ายโดยปริยาย

2

บน Linux ให้ลองใช้คำสั่งนี้โดยได้รับอนุญาตจาก root:

find / | grep \\.git$

เพียงแค่ค้นหาทุกไฟล์ที่ลงท้ายด้วย. git ... คุณสามารถทำได้ด้วยเครื่องมือค้นหาใน Windows, Linux และอื่น ๆ ...


7
ไม่มีจุดปล่อยให้ทุกอย่างเอาท์พุทจากนั้นกรองด้วยfind grepฉันอยากจะใช้--name "*.git"
Gregory Pakosz

2
@Gregory Pakosz: อะไรคือความแตกต่าง?
Michel Gokan

11
@ มิเชลคุณเริ่ม 2 โปรเซสและทำให้อันแรกส่งผ่าน/ทรีทรีไปทั้งทรีสำหรับอันที่สองเป็น grep เมื่ออันแรกสามารถทำทุกอย่างและหลีกเลี่ยงการใช้ IO ที่ไร้ประโยชน์มหาศาล ไม่ใช่ความแตกต่างที่แท้จริงสำหรับผู้ใช้ตามปกติ แต่สำหรับระบบไฟล์ขนาดใหญ่อาจสร้างความแตกต่างได้
Arkaitz Jimenez

2
ไม่ว่าจะด้วยวิธีใดก็ตามหากคุณต้องการใช้คำสั่ง JUST find ควรใช้ -regex แทน -name ... ในกรณีนี้ให้ใช้คำสั่งนี้: sudo find / -regex '. * \. git'
Michel Gokan

4
@MichelKogan ดีกว่าทำไม?
Mark Amery

2

เวอร์ชัน PowerShell ที่เรียบง่าย:

Get-ChildItem . -Recurse -Hidden .git

1
สิ่งนี้ได้ผลสำหรับฉัน! ขอบคุณ! ฉันได้รับข้อผิดพลาดบางอย่างสำหรับสถานที่บางแห่งที่พยายามเข้าถึงซึ่งทำงานในฐานะผู้ใช้ปกติสคริปต์ powershell ไม่สามารถเข้าถึงได้ แต่จากการตรวจสอบเพิ่มเติมสิ่งเหล่านี้เป็นสถานที่ที่ฉันไม่ควรกังวลอยู่แล้ว (เช่น - C:\users\<username>\PrintHood นอกจากนี้ฉัน พบว่ามีประโยชน์ในการเพิ่มเอาต์พุตลงในไฟล์และเนื่องจากฉันสนใจเฉพาะเส้นทาง (เนื่องจากสคริปต์นี้ได้รับข้อมูลจำนวนมาก) เพื่อกรองเฉพาะข้อมูลเส้นทาง / ไดเรกทอรีเท่านั้น Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
Keith E. Truesdell

1

สำหรับ Linux:

dir="/home/${USER}"
dir_not="${dir}/miniconda3"
find /home/aeug -type d -iname ".git" -o -path "${dir_not}" -prune | xargs -0 echo 

1

รูปแบบเล็กน้อยจากคำตอบของ Eric Burcham คำตอบนั้นเพิ่ม \ .git ต่อท้ายอันนี้ไม่ได้

Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.Parent.FullName }

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

push-location; Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { cd $_.parent.fullname; write-host '*************'; $(get-location).path; git fetch; git pull; git checkout .; git clean -f; git submodule update; git status; write-host '*************'; write-host ' '; }; pop-location
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.