ฉันจะรันคำสั่ง Git โดยไม่อยู่ในที่เก็บได้อย่างไร


131

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

ตัวอย่างเช่น: git /home/repo log?

ได้โปรดอย่าบอกฉันcdกับมัน ฉันกำลังexecโทรหาฉัน


3
คุณไม่สามารถ "cd / home / repo && git log" เป็นคำเรียกของ exec ได้หรือไม่?
Alex Howansky

ฉันมีปัญหาแปลก ๆ กับมัน ฉันกำลังเริ่มกระบวนการใหม่ไม่ใช่ผู้บริหาร แต่ฉันไม่รู้ว่าพวกเขาแตกต่างกันอย่างไร ฉันพบว่ามันง่ายกว่าที่จะหาพารามิเตอร์เพื่อระบุไดเร็กทอรี git
ทาวเวอร์



1
git --git-dir = / home / repo / .git log
Atiq Ur Rehman

คำตอบ:


102

ลอง:

git --git-dir=/home/repo/.git log

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

fatal: Not a git repository

2
ฉันรับfatal: Not a git repository (or any of the parent directories): .gitไปเรื่อย ๆ @ แพทริคฉันไม่ได้ลงคะแนนอะไรเลย?
ทาวเวอร์

3
@Patrick คำตอบถูกแก้ไขแล้ว (แต่เดิม--work-dirฉันคิดว่า)
Gareth

1
สิ่งนี้ไม่ได้ผลสำหรับฉันเนื่องจากแสดงไฟล์ทั้งหมดของการคอมมิตว่าถูกลบ ดูเหมือนว่ากำลังตรวจสอบการกระทำ แต่ไม่ใช่เนื้อหาของโฟลเดอร์ อ้างถึงคำตอบของ @calandoa เพื่อประสิทธิภาพที่ดีขึ้น
mxcd

2
ไม่ได้ผลสำหรับฉันโดยใช้ git ล่าสุด แต่การใช้ตัวเลือก -C มันใช้งานได้เช่น git -C /home/repo/.git log
D.Snap

1
สิ่งนี้ไม่ได้ผลตามที่คาดไว้ ทำไมจึงเป็นคำตอบที่ยอมรับ? สิ่งนี้จะใช้ dir ปัจจุบันเป็นแผนผังงานและใช้. git ที่ระบุสำหรับประวัติซึ่งผิดอย่างสิ้นเชิง หากคุณไม่เพียงแสดงบันทึกตัวอย่างเช่นgit status. -Cเป็นวิธีที่ถูกต้อง
วัง

219

ใช้-Cตัวเลือก ( เอกสาร ):

git -C /home/repo log

ซึ่งเกือบจะเทียบเท่า--git-dirและ--work-treeไม่ต่อท้าย.gitโฟลเดอร์ปกติ

แก้ไข:

คำตอบลดลง ... ค่อนข้างน่าทึ่งเนื่องจากพูดอย่างเคร่งครัดนี่เป็นคำตอบเดียวที่ถูกต้องสำหรับคำถาม ตัวเลือก--git-dirและ--work-treeไม่มีอยู่ในการเข้าถึงที่เก็บข้อมูลจากภายนอกโครงสร้างงานใช้เพื่อย้ายไปที่.gitอื่นและมีความซับซ้อนกว่ามากในการใช้ในบางกรณี

ตัวอย่างเช่นหากต้องการรับบันทึก/home/repo/subdirเท่านั้น:

git -C /home/repo/subdir log .

หรือ

git -C /home/repo log subdir

มันเป็นไปไม่ได้ที่จะใช้log .ด้วยหรือ--git-dir --work-treeต้องประมวลผลพา ธ เพื่อแยกพา ธ ย่อยที่สัมพันธ์กับด้านบนสุดของแผนผังงานและแม้ในกรณีนั้น git จะไม่รับรู้ว่าเป็นพา ธ หากคุณไม่ได้ใช้--อ็อพชันดังนั้นวิธีเดียวที่เป็นไปได้คือ:

git --git-dir /home/repo/.git log -- subdir

นอกจากนี้ยังใช้งาน--work-treeไม่ได้เลยกับคำlogสั่งย่อยกับเวอร์ชันของฉัน (git 1.9.1) มันถูกละเว้น:

git --git-dir /home/repo/.git --work-tree /home/repo/subdir log -- subdir
git --git-dir /home/repo/.git --work-tree /home/repo/whatever log -- subdir

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


ขอขอบคุณที่เพิ่มคำอธิบายเพิ่มเติม
Erick G.Hagstrom

git stashเป็นอีกตัวอย่างของคำสั่งย่อยที่ล้มเหลวหาก--git-dirและ--work-treeถูกใช้
d5ve

4
ตัวเลือก -C ถูกเพิ่มเข้ามาใน git เวอร์ชัน 1.8.5 ซึ่งเปิดตัวในปี 2013
d5ve

-C ทำงานได้ดีกว่า --git-dir สำหรับฉัน ... -C ให้เกียรติการตั้งค่า git config สำหรับ repo กำลังใช้ git เวอร์ชัน 1.9.5.msysgit.1
Straff

1
หมายเหตุ: คุณต้องส่งอ็อพชัน -C เพื่อคอมไพล์ไม่ใช่ไปยังคำสั่งย่อย (ตามที่ @calandoa ทำอย่างถูกต้องในคำตอบนี้) การโทรgit -C /some/dir add .จะทำงานตามที่คาดไว้ในขณะที่git add -C /some/dir .เกิดข้อผิดพลาด สิ่งที่ควรทราบเพื่อป้องกันผลลัพธ์ที่สับสน
Paul van Leeuwen

17

ในความเป็นจริงคุณต้องใช้ --git-dir และ --work-tree ร่วมกัน นี่คือตัวอย่าง:

local [] Desktop: mkdir git
local [] Desktop: cd git
local [] git: touch README.txt
local [] git: git init
Initialized empty Git repository in /Users/albert/Desktop/git/.git/
local [] git: cd ..
local [] Desktop: git --work-tree=git --git-dir=git/.git add .
local [] Desktop: git --work-tree=git --git-dir=git/.git commit -a -m 'initial commit, called from outside the git directory'
[master (root-commit) ee951b1] initial commit, called from outside the git directory
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.txt
local [] Desktop: cd git
local [] git: git log --pretty=oneline
ee951b161053e0e0948f9e2a36bfbb60f9c87abe initial commit, called from outside the git di

1
ถูกต้องมากกว่าคำตอบด้วย --git-dir เพียงอย่างเดียว git-scm.com/blog/2010/04/11/environment.html
Erick G. Hagstrom

11

ฉันพยายามหลายครั้งแล้ว! ในที่สุดฉันก็มาถึง!

git -C dir --no-pager log --format='%an' -1 filename

จำไว้ว่าโปรดอย่าเพิ่ม. git ในไฟล์

-C ผบ


3

คล้ายกับคำตอบของ @ max น่าเสียดายที่ --git-dir ไม่ได้ทำในสิ่งที่ฉันต้องการ แก้ไขในการหวนกลับอีก [ก่อนหน้า] --work-treeคำตอบผมไม่ได้อ่านแนะนำให้ใช้ ผมไม่แน่ใจว่าจะใช้สภาพแวดล้อมหรือธงที่มีความเหมาะสมมากขึ้นดังนั้นฉันจะออกจากคำตอบของฉันในกรณีที่มีคนพบใช้ในนั้น แต่ฉันจะเปลี่ยนไปใช้การใช้งาน/--work-tree--git-dir


มีสอง repos หนึ่งในที่อื่น แต่ไม่ใช่โมดูลย่อย repo ด้านนอกละเว้นมัน:

tools (outer repo)
  gcc/4.9.2 (inner repo)

สิ่งที่ฉันต้องการคือผลลัพธ์ที่git rev-parse --show-prefixสัมพันธ์กับ repo ภายนอก นี่คือสิ่งที่ฉันคิดขึ้นมา (bash syntax แบ่งบรรทัดเพื่อให้อ่านง่าย):

prefix_dir=$(cd ..; git rev-parse --show-toplevel)
prefix_dir=$(GIT_WORK_TREE=${prefix_dir} git rev-parse --show-prefix)

เมื่อดำเนินการจากภายใน 4.9.2 gcc/4.9.2มันผลิตสตริง


1

สำหรับคำสั่ง git ใด ๆ คุณสามารถทำได้:

git --git-dir=<PATH-TO-REPO>/.git --work-tree=<PATH-TO-REPO> <git-command>

ตัวอย่างเช่นหากคุณต้องการสร้างสถานะคอมไพล์:

 git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  status

หรือหากคุณต้องการตรวจสอบสาขาที่ repo อยู่:

git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  rev-parse --abbrev-ref HEAD
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.