git - git-dir ไม่ทำงานตามที่คาดไว้


209

ฉันพยายามเรียกใช้คอมไพล์จากสารบบที่แตกต่างจากที่ฉันมีอยู่ตัวอย่างเช่นถ้าฉันอยู่ใน:

cd /home/domain/
git status << runs perfect ie
# On branch master
# Your branch is ahead of 'origin/master' by 6 commits.

ดังนั้นตอนนี้ฉันต้องการเรียกใช้คำสั่งนี้จากไดเรกทอรีอื่นโดยใช้--git-dirตัวเลือก

ดังนั้นสมมติว่าฉันอยู่ในroot/และลองนี้:

git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

ฉันยังพยายามรวม.gitโฟลเดอร์เช่น

git --git-dir="/home/domain/.git/" status

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

หวังว่าใครบางคนสามารถให้คำแนะนำในสิ่งที่ฉันทำผิด


4
ตอนนี้ฉันมีสถานะการทำงานที่สมบูรณ์แบบ แต่ pull กำลังให้ข้อผิดพลาด ie root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / pull ต้นกำเนิดมาสเตอร์ร้ายแรง: / usr / local / libexec / git-core / git -pull ไม่สามารถใช้งานได้หากไม่มีแผนผังการทำงาน แต่สถานะใช้งานได้ ?? ความคิดใด ๆ Jon
Lee

4
นี่คือข้อผิดพลาดที่ใหญ่ที่สุดในคอมไพล์ในขณะนี้ ไม่เคารพพารามิเตอร์ --work-tree และ / หรือ --git-dir
Adam Dymitruk

5
เริ่มต้นคอมไพล์ 1.8.5 คุณจะมีทางเลือกที่จะไม่ตั้งค่า--git-dirและ--work-treeสำหรับคำสั่งง่ายๆ: ดูคำตอบของฉันด้านล่าง
VonC

คำตอบ:


314

คุณต้องกำหนด dir ทำงานเช่นกัน สับสนฉันรู้ แต่มันเป็นความยืดหยุ่น

git --git-dir=/mycode/.git --work-tree=/mycode status

คุณสามารถอ่านเพิ่มเติมได้ที่นี่


3
ขอบคุณมันใช้งานได้! ตกลงว่าสิ่งนี้ทำให้เกิดความสับสน มันเรียกว่า Keep It Simple Stupid คุณสามารถให้ความยืดหยุ่นได้เกือบทุกครั้งในขณะเดียวกันก็ให้ค่าเริ่มต้นที่ทำให้ VS รู้สึกว่าการใช้คำสั่งไม่ทำงานเลย
Nay

3
@Nick เห็นด้วยคุณคิด--git-dirว่าไม่ได้ระบุไว้มันจะตรวจสอบว่า/mycode/.gitมีอยู่จริงหรือไม่และใช้มันก่อนที่จะเกิดข้อผิดพลาด
GP89

4
@NickYeates ที่สอง! นอกจากนี้ฉันมีปัญหาเมื่อใช้ ~ เพื่ออ้างถึงโฮมไดเร็กตอรี่ของฉัน, ตัวอย่างเช่นใช้งานgit --git-dir=~/src/s3cmd/.git --work-tree=~/src/s3cmd pullไม่ได้ แต่git --git-dir=/home/username/src/s3cmd/.git --work-tree=/home/username/src/s3cmd pullทำได้
Jamie Cook

1
โปรดทราบว่าคำสั่งบางคำสั่งไม่จำเป็นต้องใช้แผนผังต้นไม้เช่น "git --git-dir = / mycode / .git log" ทำงานได้ดี ตกลงในเรื่องนี้ว่าสับสน!
yoyo

4
คำอธิบายเล็กน้อย: git --git-dir="$HOME/foo/.git" --work-tree="$HOME/foo" status
Haris Krajina

136

เริ่มต้นคอมไพล์ 1.8.5 (ซึ่งควรจะออกในสัปดาห์หน้า) มันจะง่ายกว่านี้:

 git -C "/home/domain/" status

ไม่จำเป็นต้องตั้งค่า--git-dirและ--work-treeอีกต่อไป!


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

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

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-dir=~/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

4
ฉันสะดุดที่พยายามใช้แฟล็ก -C หลังจากคำสั่ง git (เช่นgit status -C <path>ไม่ทำงาน!)
Kedar Paranjape

42

จากความคิดเห็นของคุณด้านบนดูเหมือนว่าคุณยังมีปัญหาอยู่:

root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / pull master origin
ร้ายแรง: / usr / local / libexec / git-core / git-pull ไม่สามารถใช้งานได้หากไม่มีแผนผังการทำงาน

ดูเหมือนว่าคุณตั้งใจจะเรียกใช้จากcrontabหรืออะไรก็ตาม คุณอาจจะดีกว่าหากใช้cdเพื่อสลับไปยังไดเรกทอรีการทำงานของคุณก่อน ตัวอย่างเช่น:

root @ erx [/] # (cd / home / domain && git pull master เป็นต้น)

นี้จะเป็นการชั่วคราว (ใน subshell ซึ่งเป็นสิ่งที่วงเล็บไม่) เปลี่ยนไดเรกทอรีปัจจุบันไปและเรียกใช้แล้ว/home/domain git pull origin masterหลังจากคำสั่งเสร็จสมบูรณ์ไดเรกทอรีปัจจุบันของคุณจะยังคงอยู่สิ่งที่อยู่ก่อนหน้าคำสั่ง


การใช้ subshell นั้นเรียบง่ายและสวยงาม ฉันไม่รู้ว่าทำไมฉันไม่เคยคิดอย่างนั้นมาก่อน!
Ehtesh Choudhury

ขออภัย @Greg ลงคะแนนให้กับคำตอบอื่น ๆ ของจอนเพราะมันตอบคำถามที่ถาม - แต่ฉันคิดว่าคุณเป็นจุดที่มีจุดและตอบความตั้งใจและความเข้าใจของคุณเช่น () s เป็นสิ่งที่ฉันกำลังมองหา +10
Darren Bishop

1
git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

ด้วย Git 2.26 (Q1 2020) เอกสารจะชัดเจนขึ้น

หนึ่งผลของการระบุตำแหน่งที่GIT_DIRเป็น (อย่างใดอย่างหนึ่งกับตัวแปรสภาพแวดล้อมหรือด้วยgit --git-dir=<where> cmdตัวเลือก "") คือการปิดการใช้งานการค้นหาที่เก็บปิดการใช้งานการค้นพบพื้นที่เก็บข้อมูล

สิ่งนี้ทำให้เกิดความเครียดมากขึ้นในเอกสารประกอบเนื่องจากผู้ใช้ใหม่มักสับสน

ดูกระทำ d82ad54 (30 มกราคม 2020) โดยHeba Waly (HebaWaly )
(ผสานโดยJunio ​​C Hamano - gitster-ในการกระทำ 17e4a1b , 12 Feb 2020)

git: อัปเดตเอกสารประกอบสำหรับ --git-dir

ลงชื่อออกโดย: Heba Waly
ช่วยเหลือโดย: Junio ​​C Hamano

git --git-dir <path> ค่อนข้างสับสนและบางครั้งก็ไม่ทำงานอย่างที่ผู้ใช้คาดหวัง

ตัวอย่างเช่นหากผู้ใช้รันgit --git-dir=<path> statusgit จะข้ามอัลกอริทึมการค้นหาที่เก็บและจะกำหนดแผนผังต้นไม้ให้กับไดเรกทอรีงานปัจจุบันของผู้ใช้เว้นแต่จะระบุไว้เป็นอย่างอื่น
เมื่อการมอบหมายนี้ไม่ถูกต้องผลลัพธ์จะไม่ตรงกับความคาดหวังของผู้ใช้

โปรแกรมปรับปรุงนี้จะปรับปรุงเอกสารเพื่อให้ชัดเจนยิ่งขึ้น

ดังนั้นเอกสารสำหรับgit --git-dirตอนนี้รวมถึง:

--git-dir=<path>:

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

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

หากคุณไม่ได้อยู่ในไดเรกทอรีระดับบนสุดของแผนผังการทำงานคุณควรบอก Git โดยที่ระดับบนสุดของแผนผังการทำงานพร้อม--work-tree=<path>ตัวเลือก (หรือGIT_WORK_TREEตัวแปรสภาพแวดล้อม)

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