การเปรียบเทียบโฟลเดอร์กับโฟลเดอร์ย่อยของที่เก็บ git


6

ฉันมีโฟลเดอร์ที่nowส่งออกครั้งเดียวจากที่เก็บ git และที่เก็บ git เอง:

/
/now/
/repository.git/

ฉันต้องการเปรียบเทียบไฟล์ในnowสถานะปัจจุบันของที่เก็บ ในขณะนี้จะกระทำได้อย่างง่ายดายด้วย--git-dir=/repository.gitและ--work-tree=/now,

git --git-dir=/repository.git --work-tree=/now status

มันไม่ชัดเจนสำหรับฉันเมื่อnowเป็นโฟลเดอร์ย่อยของเนื้อหาในที่เก็บ git

มีวิธีอื่นนอกจากการตรวจสอบพื้นที่เก็บข้อมูลอีกครั้งและdiffสิ่งที่จะมีการgitเปรียบเทียบโฟลเดอร์และโฟลเดอร์ย่อยที่เกี่ยวข้องในพื้นที่เก็บข้อมูลหรือไม่? (ฉันรู้ว่าคอมไพล์ไม่ได้อยู่กึ่งกลางความคิดของการเปลี่ยนแปลงในไฟล์เดียวดังนั้นฉันจึงคาดหวังว่าจะได้รับข้อมูลที่ดี)

คำตอบ:


2

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

diff-sub() { : usage: diff-sub repo treeish-in-repo external-dir
  (
    GIT_DIR="$1" GIT_WORK_TREE="$3"
    GIT_INDEX_FILE=/tmp/.git-index--now-sub.tmp
    if test -e "$GIT_INDEX_FILE"; then
      echo "already exists: $GIT_INDEX_FILE"
      exit 1
    fi
    export GIT_DIR GIT_INDEX_FILE GIT_WORK_TREE
    git read-tree "$2" &&
    git diff
    ec=$?
    rm -f "$GIT_INDEX_FILE"
    exit "$ec"
  )
}
: diff sub from master in /repository.git against /now
diff-sub /repository.git master:sub /now

หมายเหตุ: หากคุณเรียกใช้คำสั่ง Git อื่น ๆ ที่เปรียบเทียบกับต้นไม้เต็มปกติ (เช่นgit statusหรือgit diff --cachedแทนgit diff) คุณจะเห็นผลลัพธ์ที่ดูแปลก ๆ เนื่องจากทั้งดัชนีและต้นไม้ทำงานมีเพียงส่วนหนึ่งของต้นไม้เต็มปกติ


หืมความคิดที่น่าสนใจ คุณจะรับไฟล์ดัชนีชั่วคราวได้อย่างไร ฉันดูสิ่งที่ชอบgit-read-treeและรูปแบบของไฟล์ดัชนีตัวเอง แต่ฉันยังไม่ได้คิดนอกเหนือจากการแก้ไขไฟล์ไบนารี
Boldewyn

คุณควรใช้คำสั่ง Git เพื่ออ่าน / อัปเดตไฟล์ดัชนี Git (เช่นคุณไม่จำเป็นต้องรู้เกี่ยวกับรูปแบบไบนารีบนดิสก์เว้นแต่คุณจะเขียนคำสั่ง“ การประปา” ของคุณเอง) เมื่อตั้งค่าตัวแปรสภาพแวดล้อม GIT_INDEX_FILE คำสั่ง Git ทั้งหมดจะใช้ไฟล์ที่ระบุแทนไฟล์ดัชนีปกติ (ปกติ.git/index) ในกรณีของรหัสเชลล์ในคำตอบgit read-treeคำสั่งจะสร้างไฟล์ดัชนีทางเลือกและgit diffคำสั่งจะอ่านและเปรียบเทียบเนื้อหาที่มีประสิทธิภาพกับแผนผังการทำงานที่ระบุ
Chris Johnsen

2

คุณสามารถสร้างโครงสร้างไดเรกทอรีใหม่ที่นำไปสู่โฟลเดอร์ย่อยและใช้ประโยชน์จาก--relativeตัวเลือกไปยังคำสั่งเช่นdiffและlog(แต่ไม่ใช่status) ตัวอย่างเช่นหากคุณมีการชำระเงินของsub/dir:

mkdir -p sub
mv now sub/dir
git --git-dir=/repository.git diff --relative=sub/dir

+1 ขอบคุณ ฉันคิดว่ามันเป็นไปไม่ได้หากไม่มีmv?
Boldewyn

@ Boldewyn: ไม่ใช่ที่ฉันรู้ แต่ฉันเป็นมือใหม่คอมไพล์ หากการย้ายปัญหาบางทีคุณอาจจะใช้cp -al(ไดเรกทอรีสำเนายากเชื่อมโยงไฟล์) หรือbindfs
Gilles

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