ได้รับ "fatal: not a git repository:". "" เมื่อใช้ post-update hook เพื่อเรียกใช้งาน 'git pull' บน repo อื่น


90

ฉันเพิ่งเริ่มคอมไพล์ดังนั้นฉันขอโทษ (และโปรดแก้ไขฉันด้วย) หากฉันใช้คำศัพท์ผิด ๆ ที่นี่ แต่ฉันจะพยายามอย่างดีที่สุด

ฉันกำลังพยายามตั้งค่า repo git (ฮับ) และไซต์การพัฒนาที่ทำงานได้ (ไพรม์) บนเว็บเซิร์ฟเวอร์ ฉันได้พยายามที่รูปแบบมันหลังจากที่บทความนี้ ฉันต้องการให้สำเนาการทำงานของการพัฒนาอัปเดตเมื่อใดก็ตามที่ฮับ repo ถูกผลักไปที่ ฉันรู้สึกว่าตะขอที่เหมาะสมสำหรับสิ่งนี้คือpost-updateสิ่งที่ฉันสร้างขึ้น:

#!/bin/sh
whoami
cd /path/to/working-copy/
RET=`git pull`
echo $RET

อัปเดต

เมื่อฉันพุชการเปลี่ยนแปลงจาก repo ในเครื่องไปยังฮับเปล่าฉันจะได้ผลลัพธ์ต่อไปนี้จากสคริปต์หลังการอัปเดต:

remote: sites
remote: fatal: Not a git repository: '.'

อย่างไรก็ตามหากฉัน SSH เข้าสู่เซิร์ฟเวอร์ในฐานะ 'ไซต์' ของผู้ใช้และเรียกใช้สคริปต์นี้ด้วยตนเองมันใช้งานได้ดีมีความคิดใด ๆ เกี่ยวกับสิ่งที่อาจเกิดขึ้นกับตะขอหรือสคริปต์นี้

คำตอบ:


179

นี่คือสคริปต์ที่ใช้งานได้ในที่สุด ฉันคิดว่าตอนแรกที่ฉันขาดหายไปซึ่งทำให้ไม่สามารถทำงานจากระยะไกลได้คือไฟล์unset GIT_DIR

#!/bin/sh
cd /path/to/working-copy/ || exit
unset GIT_DIR
git pull repo branch

exec git-update-server-info

18
ฉันยืนยันได้GIT_DIRการยกเลิกการตั้งค่าจะช่วยแก้ปัญหาได้
jmtd

16
สำหรับผู้ที่เต็มใจเข้าใจว่าทำไมมันเป็นเพราะคอมไพล์ใช้ตัวแปรแทนGIT_DIR -ing เปลี่ยนไม่ใช่. ต้องมีทางเลือกในการคอมไพล์จากถึงไม่ควรเป็นอันดับแรก PWDcdPWDGIT_DIRGIT_DIRPWD
zupa

คำถามคือทำไมต้องเห็นว่า git จำเป็นต้องทำเช่นนี้สำหรับ hook script (ตั้งค่า GIT_DIR เพื่อให้แม้แต่สคริปต์มี 'cd' ที่อื่น 'git อะไรก็ได้' ก็ยังใช้งานได้)? โดยส่วนตัวแล้วฉันจะเลือกที่คอมไพล์ไม่ใช้เวทมนตร์แบบนี้
Steven Haryanto

2
เหตุผลเบื้องหลังคือ Git ใช้ตัวแปรสภาพแวดล้อมบางอย่างกับคำสั่ง git หลักทั้งหมด
Casey

เกิดอะไรขึ้นเมื่อมีความขัดแย้งที่ผสานหลังgit pull?
lolololol ถึง


0

แม้ว่า GIT_DIR ที่ไม่ได้ตั้งค่าจะใช้งานได้

ปัญหาเกิดขึ้นเมื่อคุณตั้งค่า GIT_DIR ผิดที่อื่น

คุณสามารถเพิ่มสิ่งนั้นแทน: GIT_DIR = .git / มันจะทำงาน


0

ในกรณีของฉันฉันได้ระบุโครงสร้างการทำงานและสิ่งนี้จะแบ่งคำสั่งบางคำสั่งเช่นpull(หรือแม่นยำfetchกว่านั้น)

หากต้องการยกเลิกการตั้งค่าโครงสร้างการทำงานหากอยู่ในการกำหนดค่าคอมไพล์ของคุณผ่าน:

git config --unset core.worktree

(มีวิธีอื่นในการกำหนดโครงสร้างงาน)

สิ่งสำคัญที่ควรทราบ

ไม่มีการเปลี่ยนแปลงใด ๆ ที่เป็นปัญหาของคุณเว้นแต่คุณจะขุดหลุมนี้รอบ ๆ ตัวคุณโดยใช้ worktree ที่กำหนดเองในตอนแรก

ล้อเล่น:

สิ่งนี้บ่งบอกถึงฉันว่า git ภายในใช้พา ธ ที่สัมพันธ์กับ worktree + .git/ในบางกรณี จากประสบการณ์ของฉัน worktrees ไม่ได้รับการสนับสนุนอย่างดียกเว้นโดยส่วนพื้นฐานที่สุดของ git ฉันไม่ได้ทดลองอย่างละเอียด Git อาจทำงานได้ถ้าฉันตั้งค่าตัวแปร config ของไดเรกทอรี git ใด ๆ ที่ถูกต้องซึ่งฉันไม่ได้เล่นด้วย


-1

คุณอาจมีปัญหาเรื่องสิทธิ์ ฉันไม่แน่ใจว่าคุณตั้งค่า repo git เปล่าของคุณอย่างไร แต่ถ้ามันทำงานภายใต้gitผู้ใช้ตรวจสอบให้แน่ใจว่าgitผู้ใช้ได้รับอนุญาตให้ดำเนินการgit pullในไดเรกทอรีโครงการของคุณ

เลือกที่จะลองสิ่งนี้เพื่อค้นหาว่าคุณเป็นผู้ใช้รายใดเมื่อเรียกใช้เบ็ด

echo `whoami`

หากฉันเข้าสู่เซิร์ฟเวอร์ในฐานะผู้ใช้ git ฉันสามารถใช้ git pull ในไดเร็กทอรีโครงการของฉันได้โดยไม่มีปัญหา ฉันเชื่อว่านั่นคือผู้ใช้ที่ควรเรียกใช้สคริปต์ ฉันสามารถลองเพิ่ม whoami line ลงในสคริปต์ได้ แต่ผลลัพธ์จากสคริปต์นั้นจะไปที่ไหนเมื่อเรียกใช้งานเป็น hook บางทีฉันอาจต้องส่งผลลัพธ์นั้นไปยังไฟล์บันทึกแทนการสะท้อน?
Ty W

สิ่งที่echo `whoami`ทำwhoamiไม่ได้?
Christoffer Hammarström

เอาต์พุตไปยัง stdout จากสคริปต์ hook จะมองเห็นได้จากรีโมตที่ทำการดำเนินการ หรือกล่าวอีกนัยหนึ่งถ้าคุณพูดว่า 'git push' เอาต์พุตจากขอเกี่ยวบนรีโมทจะปรากฏใน stdout ของคุณ
ebneter

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