มีวิธีดำเนินการคำสั่ง Git กับที่เก็บโดยไม่อยู่ในที่เก็บนั้นหรือไม่?
ตัวอย่างเช่น: git /home/repo log?
ได้โปรดอย่าบอกฉันcdกับมัน ฉันกำลังexecโทรหาฉัน
มีวิธีดำเนินการคำสั่ง Git กับที่เก็บโดยไม่อยู่ในที่เก็บนั้นหรือไม่?
ตัวอย่างเช่น: git /home/repo log?
ได้โปรดอย่าบอกฉันcdกับมัน ฉันกำลังexecโทรหาฉัน
คำตอบ:
ลอง:
git --git-dir=/home/repo/.git log
สิ่งสำคัญคือต้องกำหนดพา ธ ไปจนถึงไดเร็กทอรี. git ของที่เก็บของคุณ มิฉะนั้นคุณจะได้รับเฉพาะข้อความแสดงข้อผิดพลาดที่ระบุว่า:
fatal: Not a git repository
fatal: Not a git repository (or any of the parent directories): .gitไปเรื่อย ๆ @ แพทริคฉันไม่ได้ลงคะแนนอะไรเลย?
--work-dirฉันคิดว่า)
git status. -Cเป็นวิธีที่ถูกต้อง
ใช้-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
ฉันไม่เข้าใจด้วยซ้ำว่านี่เป็นจุดบกพร่องหรือคุณสมบัติ ... ตามปกติที่มีตัวเลือกการออกแบบคอมไพล์มากมาย
git stashเป็นอีกตัวอย่างของคำสั่งย่อยที่ล้มเหลวหาก--git-dirและ--work-treeถูกใช้
git -C /some/dir add .จะทำงานตามที่คาดไว้ในขณะที่git add -C /some/dir .เกิดข้อผิดพลาด สิ่งที่ควรทราบเพื่อป้องกันผลลัพธ์ที่สับสน
ในความเป็นจริงคุณต้องใช้ --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
ฉันพยายามหลายครั้งแล้ว! ในที่สุดฉันก็มาถึง!
git -C dir --no-pager log --format='%an' -1 filename
จำไว้ว่าโปรดอย่าเพิ่ม. git ในไฟล์
-C ผบ
คล้ายกับคำตอบของ @ 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มันผลิตสตริง
สำหรับคำสั่ง 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