ใช้คำสั่ง git“ log” ในโฟลเดอร์อื่น


128

ฉันมีไฟล์ php อยู่ในโฟลเดอร์ A (ซึ่งเป็นโครงการคอมไพล์) ในไฟล์ php เหล่านี้ฉันต้องการเรียกใช้ "git log" แต่สำหรับโฟลเดอร์ B โฟลเดอร์ B เป็นโปรเจ็กต์ git อื่น (ดังนั้นบันทึกจึงแตกต่างกันระหว่าง A และ B)

ฉันจะทำสิ่งนั้นด้วยคำสั่งเชลล์ได้อย่างไร


3
cd /other/dir && git log && cd -ใน bash shell?
takehin

1
ด้วย git 1.8.5 (Q4 2013) คุณจะมีทางเลือกอื่นแทนการตั้งค่า--git-dir: ดูคำตอบของฉันด้านล่าง
VonC

คำตอบ:


189

จากman git:

คุณสามารถทำได้โดยใช้--git-dirพารามิเตอร์ก่อนที่จะส่งคำสั่งใด ๆ

git --git-dir /foo/bar/.git log

( .gitจำเป็นต้องระบุไดเร็กทอรี) จากเอกสาร :

--git-dir=<path>

กำหนดเส้นทางไปยังที่เก็บ นอกจากนี้ยังสามารถควบคุมได้โดยการตั้งค่าGIT_DIRตัวแปรสภาพแวดล้อม อาจเป็นเส้นทางสัมบูรณ์หรือเส้นทางสัมพัทธ์ไปยังไดเร็กทอรีการทำงานปัจจุบัน


26
คุณต้องอ้างอิง.gitไดเร็กทอรี ลองgit --git-dir=/foo/bar/.git log.
mipadi

6
ขอโทษฉันผิดคุณไม่ได้ใส่ = ระหว่าง --git-dir และชื่อไดเรกทอรี มันจึงกลายเป็นคอมไพล์ --git-dir / foo / bar log
rgngl

23
คำเตือน! วิธีนี้เสียสำหรับการดำเนินงานอื่น ๆ logมากกว่า ลองgit --git-dir /foo/someclone/.git status- คอมไพล์สับสนไปหมด ฉันขอแนะนำ-Cตามที่ระบุไว้ด้านล่าง
ออกอากาศ

ฉันยังไม่เจอหน้าวิธีใช้คอมไพล์ที่มีสตริง "--git-dir": "(
thinsoldier

1
@thinsoldier man gitทำในระบบของฉัน (2.3.5) แต่คำตอบของ @VonC ทำงานได้ดีกว่ามาก
Calimo

146

ด้วยคอมไพล์ 1.8.5 (ไตรมาสที่ 4 ปี 2013)--git-dirคุณจะมีทางเลือกอื่นแทนการตั้งค่า
หากคุณต้องการดำเนินการgit logในโฟลเดอร์Bให้พิมพ์:

git -C B log

เช่นเดียวกับ " make -C <directory>" " git -C <directory> ..." บอก Git ไปที่นั่นก่อนที่จะทำอะไรอย่างอื่น


ดูการกระทำ 44e1e4โดยNazri Ramliy :

ต้องใช้การกดแป้นมากขึ้นเพื่อเรียกใช้คำสั่ง git ในไดเร็กทอรีอื่นโดยไม่ต้องออกจากไดเร็กทอรีปัจจุบัน:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-tree=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

วิธีการที่แสดงด้านบนเป็นที่ยอมรับสำหรับการเขียนสคริปต์ แต่ยุ่งยากเกินไปสำหรับการเรียกใช้บรรทัดคำสั่งอย่างรวดเร็ว

ด้วยตัวเลือกใหม่นี้ข้างต้นสามารถทำได้โดยกดแป้นน้อยลง:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done

19
นี้เป็นวิธีการที่เชื่อถือได้มากขึ้นและการทำงานสำหรับคำสั่งอื่น ๆ logกว่า
ออกอากาศ

ว้าวและไม่มีอะไรในหน้าคน! ช่างน่าเสียดาย (ตกลงตอนนี้ฉันเห็นมันเพิ่มใน 2.7 man page)
akostadinov

น่าเศร้าที่นี่ยังไม่ค่อยดีเท่าตัว-Rเลือกของ Mercurial เนื่องจากมันทำให้เส้นทางสัมพัทธ์ยุ่งเหยิง ตัวอย่างเช่นถ้าฉันพิมพ์git -C subdir log subdir/myfileจะมีข้อผิดพลาด (เนื่องจากค้นหาไฟล์subdir/subdir/myfile)
jwd

--git-dir สะดวกกว่าเมื่อคุณทำสิ่งนี้:for p in (find . -type d -name ".git"); do git --git-dir $p ...; done
shabunc

1
@jwd: ฉันไม่แน่ใจว่ามันเป็นปัญหาอย่างไร? สิ่งที่คุณยกมาคือพฤติกรรมที่แม่นยำที่ฉันคาดหวังและฉันไม่อยากgitคิดว่ามันฉลาดกว่าฉันและสิ่งที่ฉันพิมพ์ ถ้าฉันพูดว่า 'เรียกใช้สิ่งนี้ในไดเรกทอรี X' ฉันไม่ได้หมายถึง 'ยกเว้นบางครั้งให้ทำอย่างอื่น'
underscore_d
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.