มีวิธีใดบ้างที่ฉันสามารถดูที่เก็บ git ทั้งหมดที่มีอยู่ในเครื่องของฉันได้ คำสั่งใด ๆ สำหรับสิ่งนั้น?
มีวิธีใดบ้างที่ฉันสามารถดูที่เก็บ git ทั้งหมดที่มีอยู่ในเครื่องของฉันได้ คำสั่งใด ๆ สำหรับสิ่งนั้น?
คำตอบ:
หากคุณอยู่ใน Linux find / -name ".git"ไม่เช่นนั้นจะไม่มีทางเป็นไดเร็กทอรีมาตรฐานเพียงแค่ใช้โปรแกรมค้นหาไฟล์ / โฟลเดอร์ OS ของคุณเพื่อค้นหา.gitโฟลเดอร์ที่มีชื่อ
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
คำตอบดั้งเดิม : ใช้งานได้ดีจาก 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 ภายใต้ไดเรกทอรีปัจจุบัน หากคุณต้องการที่เก็บทั้งหมดในไดรฟ์คุณควรรันคำสั่งหนึ่งครั้งจากรูทของแต่ละไดรฟ์
ใน * nix สิ่งนี้จะพบที่--bareเก็บใด ๆ
find / -name "*.git" -type d
name.gitนั่นเป็นเพียงแบบแผนตัวอย่างเช่นฉันไม่ปฏิบัติตาม
findrepos เหล่านั้นหรือไม่?
เก็บ 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
)
บน Linux วิธีที่เร็วกว่าคือ:
locate -r "\.git$"
สมมติว่าคุณอัปเดตฐานข้อมูลของตำแหน่งด้วย sudo updatedb
บน 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มีอยู่จะไม่มีการต่อท้ายโดยปริยายบน Linux ให้ลองใช้คำสั่งนี้โดยได้รับอนุญาตจาก root:
find / | grep \\.git$
เพียงแค่ค้นหาทุกไฟล์ที่ลงท้ายด้วย. git ... คุณสามารถทำได้ด้วยเครื่องมือค้นหาใน Windows, Linux และอื่น ๆ ...
find grepฉันอยากจะใช้--name "*.git"
/ทรีทรีไปทั้งทรีสำหรับอันที่สองเป็น grep เมื่ออันแรกสามารถทำทุกอย่างและหลีกเลี่ยงการใช้ IO ที่ไร้ประโยชน์มหาศาล ไม่ใช่ความแตกต่างที่แท้จริงสำหรับผู้ใช้ตามปกติ แต่สำหรับระบบไฟล์ขนาดใหญ่อาจสร้างความแตกต่างได้
เวอร์ชัน PowerShell ที่เรียบง่าย:
Get-ChildItem . -Recurse -Hidden .git
C:\users\<username>\PrintHood นอกจากนี้ฉัน พบว่ามีประโยชน์ในการเพิ่มเอาต์พุตลงในไฟล์และเนื่องจากฉันสนใจเฉพาะเส้นทาง (เนื่องจากสคริปต์นี้ได้รับข้อมูลจำนวนมาก) เพื่อกรองเฉพาะข้อมูลเส้นทาง / ไดเรกทอรีเท่านั้น Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
สำหรับ Linux:
dir="/home/${USER}"
dir_not="${dir}/miniconda3"
find /home/aeug -type d -iname ".git" -o -path "${dir_not}" -prune | xargs -0 echo
รูปแบบเล็กน้อยจากคำตอบของ 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