จะแก้ไขที่เก็บ git ที่เสียหายได้อย่างไร


106

ฉันพยายามโคลนที่เก็บของฉันซึ่งฉันเก็บไว้ใน Ubuntu หนึ่งโฟลเดอร์ไปยังเครื่องใหม่และฉันได้รับสิ่งนี้:

christopher@christopher-laptop:~/source/personal$ git clone ~/Ubuntu\ One\ Side\ Work/projects.git/
Cloning into 'projects'...
done.
fatal: unable to read tree 29a422c19251aeaeb907175e9b3219a9bed6c616
christopher@christopher-laptop:~/source/personal$ 

ผมก็เลยลองดูคำถามอื่น ๆ แบบนี้ที่ถูกถามที่นี่และส่วนใหญ่บอกว่าวิ่งgit fsck --fullแล้วผมจะได้รับเมื่อลองทำ

christopher@christopher-laptop:~/Ubuntu One Side Work/projects.git$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (447/447), done.
broken link from  commit 235ae1f48701d577d71ebd430344a159e5ba4881
              to  commit 984c11abfc9c2839b386f29c574d9e03383fa589
broken link from    tree 632a9cf0ef9fccea08438b574e2f1c954f4ff08b
              to    blob 25a742dff0a403b2b3884f2ffddf63eb45721fac
broken link from    tree 632a9cf0ef9fccea08438b574e2f1c954f4ff08b
              to    blob dd4e97e22e159a585b20e21028f964827d5afa4e
broken link from    tree 632a9cf0ef9fccea08438b574e2f1c954f4ff08b
              to    tree 29a422c19251aeaeb907175e9b3219a9bed6c616
broken link from    tree 632a9cf0ef9fccea08438b574e2f1c954f4ff08b
              to    tree 8084e8e04d510cc28321f30a9646477cc50c235c
broken link from    tree 774b5b4157b4caae1c6cad96c8eaf5d4eba2c628
              to    blob a0daa0c1567b55d8de2b4d7a3bc010f58c047eab
broken link from    tree 774b5b4157b4caae1c6cad96c8eaf5d4eba2c628
              to    blob e9052d35bfb6d30065b206fc43f4200a04d5281b
broken link from    tree 774b5b4157b4caae1c6cad96c8eaf5d4eba2c628
              to    blob 1a3a5e4dd2502ac121c22f743c4250e254a94eeb
broken link from    tree 4aa336dc1a5838e8918e03b85580069d83f4ad09
              to    tree 8cc55ec952dc192a233e062201d1e7e873ac3db0
broken link from    tree e5674a91a53e15575a1f3bf5786bc5cc719fb483
              to    blob 4a994e1e7bb7ce28dcec98bad48b9a891d7dec51
broken link from    tree e5674a91a53e15575a1f3bf5786bc5cc719fb483
              to    blob ac033bf9dc846101320c96a5ce8aceb8c96ec098
broken link from    tree 252ab84542264e1589576b6ee51e7a31e580a0e2
              to    tree 2069041cd5950e529e2991d37b7290ec021d90d4
broken link from    tree 2d4964aa4d4f5d8c7228518ce72ef6a63f820c6d
              to    blob d83690e1b9a6bdd8a08754b38231799acefcb2ab
broken link from    tree c7192e82fc581bd6448bda1a25e8729bdac5f4ff
              to    blob 30d54d47ae82add1917ca173d42e58b396df580b
broken link from    tree 7c66306901fc71389623286936cef172d4ffe408
              to    blob bc7e05d705401273b1df4e939de0f540597c0931
broken link from    tree 0940f5fd227d4c84d6e6749d872db50a4522ae3a
              to    tree 923767594ac22023e824948d65622fe5b407d1a1
broken link from    tree 8eadcd2a971e8357d24f0d80f993d2963452209f
              to    blob 2598bde3dc8cb80ee49510b8159344004b88645f
broken link from    tree ffa302dd0d969172ef23caeefe856ab2f57a4e4d
              to    blob d6925fa431be1ac585bf9a481e98f75107a6e6fb
broken link from    tree 7045b8870a49ce30a2027537a96d73d162bda773
              to    blob 25688652dea26f61f576ca1b52b9d1a18fbfd01d
broken link from    tree 37e4705d34bd440ce681ae32ae9a180a13256d72
              to    tree 246f564d4cee53339b8a4244f3173b61caa518eb
missing blob d6925fa431be1ac585bf9a481e98f75107a6e6fb
missing blob ac033bf9dc846101320c96a5ce8aceb8c96ec098
missing tree 29a422c19251aeaeb907175e9b3219a9bed6c616
missing tree 8084e8e04d510cc28321f30a9646477cc50c235c
missing blob 30d54d47ae82add1917ca173d42e58b396df580b
missing tree 8cc55ec952dc192a233e062201d1e7e873ac3db0
missing blob e9052d35bfb6d30065b206fc43f4200a04d5281b
dangling tree 4b26e95db542c72ac4a22ec25abe38fb2de79752
missing blob d83690e1b9a6bdd8a08754b38231799acefcb2ab
missing blob 25a742dff0a403b2b3884f2ffddf63eb45721fac
missing tree 923767594ac22023e824948d65622fe5b407d1a1
missing blob 25688652dea26f61f576ca1b52b9d1a18fbfd01d
missing blob 2598bde3dc8cb80ee49510b8159344004b88645f
dangling tree 3a683869f1bb0c1634de75700c316b3b36570dbd
dangling blob 4098d30843380d798a811f1aa9a02994f0dbbb27
missing tree 2069041cd5950e529e2991d37b7290ec021d90d4
missing blob 4a994e1e7bb7ce28dcec98bad48b9a891d7dec51
missing blob 1a3a5e4dd2502ac121c22f743c4250e254a94eeb
missing blob a0daa0c1567b55d8de2b4d7a3bc010f58c047eab
dangling tree 6c7b5162aa7a303fa3fe8dc393c5da564e309521
missing commit 984c11abfc9c2839b386f29c574d9e03383fa589
missing blob bc7e05d705401273b1df4e939de0f540597c0931
missing blob dd4e97e22e159a585b20e21028f964827d5afa4e
missing tree 246f564d4cee53339b8a4244f3173b61caa518eb
dangling commit a01f5c1e5315dc837203d6dee00d3493be9c5db9

นั่นดูแย่จริงๆ เมื่อฉันทำgit log | headฉันจะได้รับสิ่งนี้

christopher@christopher-laptop:~/Ubuntu One Side Work/projects.git$ git log | head
error: Could not read 984c11abfc9c2839b386f29c574d9e03383fa589
fatal: Failed to traverse parents of commit 235ae1f48701d577d71ebd430344a159e5ba4881
commit 2fb0d2d0643b445440f01b164f11ee9ee71fca48
Author: christopher <christopher@christopher.christopher>
Date:   Wed Aug 7 15:51:42 2013 -0400

    finishing chapter 7

คำถามอื่น ๆ ./git/refs/heads/masterที่นี่ได้กล่าวว่าจะมองไปที่ เป็น repo เปล่าและrefs/heads/มีอยู่ แต่refs/heads/masterไม่มี HEAD ใน repo เปลือยกล่าวว่าref: refs/heads/masterแม้ว่า

packed-refs พูดแบบนี้

# pack-refs with: peeled 
2fb0d2d0643b445440f01b164f11ee9ee71fca48 refs/heads/master

ยังมีคำถามอื่น ๆ ที่แนะนำให้เรียกใช้git reflogและไม่มีผลลัพธ์ปรากฏขึ้นเมื่อฉันเรียกใช้

ดังนั้นฉันไม่รู้ว่าจะทำอย่างไรที่นี่ ควรใช้กลยุทธ์อะไร เป็นไปได้ไหมที่จะรีเซ็ตหัวเป็นการคอมมิตครั้งสุดท้ายในวันที่ 7 ส.ค.

แก้ไข:

การทำบันทึกคอมไพล์และไปที่ด้านล่างของผลลัพธ์หน้าจอจะแสดงสิ่งนี้:

commit 996e03b949aea176238e3c7a8452700bbb987ac9
Author: christopher <christopher@christopher>
Date:   Wed Jul 3 23:00:44 2013 -0400

    many many changes
error: Could not read 984c11abfc9c2839b386f29c574d9e03383fa589
fatal: Failed to traverse parents of commit 235ae1f48701d577d71ebd430344a159e5ba4881

ดูเหมือนว่าจะป้องกันไม่ให้ git prune ทำงาน


3
สิ่งนี้ไม่ได้ช่วยอะไรมากนัก แต่อย่าจัดเก็บ Git repos ใน Dropbox หรือบริการซิงค์อื่น ๆ Git ไม่ได้สร้างขึ้นเพื่อจัดการกับโปรแกรมอื่นที่ล็อกและเขียนไฟล์แบบสุ่มในขณะที่กำลังทำอย่างอื่น
มิลลิโมส

ที่เกี่ยวข้อง: stackoverflow.com/q/18550073/1301972
Todd A.Jacobs

2
คำตอบเกือบทั้งหมดถือว่าเราสามารถโคลนซ้ำได้จากแหล่งกำเนิดระยะไกลที่ไม่เสียหายบางส่วน นี่คือปัญหา ... จะเกิดอะไรขึ้นถ้าคุณเป็นคนต้นกำเนิดและคุณเสียหาย? ขวา. ดังนั้นที่นี่: git-repairเป็นโปรแกรมที่จะทำงานgit fsckและพยายามอย่างเต็มที่เพื่อแก้ไขปัญหาที่พบ git-repair.branchable.comดูเหมือนจะมีความสามารถมากและแม้ว่าคุณอาจต้องคัดลอกวัตถุ (ถ้าทำได้!) จากข้อมูลสำรอง (คุณมีข้อมูลสำรองใช่ไหม) มันจะช่วยให้คุณประหยัดเวลาได้มากโดย กอบกู้ทุกสิ่งที่ทำได้และทำให้คุณได้งานจริงไม่ใช่งานอัตโนมัติมากมาย ไม่มีความเกี่ยวข้อง ฯลฯ
underscore_d

คำตอบ:


119

เป็นอีกทางเลือกหนึ่งของตัวเลือกสุดท้ายของ CodeGnome หากเฉพาะ repo ในเครื่องเสียหายและคุณทราบ url ไปยังรีโมตคุณสามารถใช้สิ่งนี้เพื่อตั้งค่าใหม่.gitให้ตรงกับรีโมต (แทนที่${url}ด้วยรีโมต url):

mv -v .git .git_old &&            # remove old git
git init &&                       # initialise new repo
git remote add origin "${url}" && # link to old repo
git fetch &&                      # get old history
git reset origin/master --mixed   # force update to old history

สิ่งนี้จะทำให้ต้นไม้ทำงานของคุณไม่เสียหายและมีผลต่อการทำบัญชีของคอมไพล์เท่านั้น
ฉันเพิ่งสร้างสคริปต์ทุบตีเพื่อจุดประสงค์นี้ (ภาคผนวก A) ซึ่งครอบคลุมความปลอดภัยเล็กน้อยในการดำเนินการนี้

บันทึก:

หาก repo ของคุณมีโมดูลย่อยกระบวนการนี้จะทำให้พวกเขายุ่งเหยิงและทางออกเดียวที่ฉันพบจนถึงตอนนี้คือการลบออกแล้วใช้git submodule update --init(หรือโคลน repo ใหม่ แต่ดูเหมือนจะรุนแรงเกินไป )

ภาคผนวก A - สคริปต์ฉบับเต็ม

#!/bin/bash

# Author: Zoey Llewellyn "Zobean" Hewll
#
# Usage: fix-git [REMOTE-URL]
#   Must be run from the root directory of the repository.
#   If a remote is not supplied, it will be read from .git/config
# 
# For when you have a corrupted local repo, but a trusted remote.
# This script replaces all your history with that of the remote.
# If there is a .git, it is backed up as .git_old, removing the last backup.
# This does not affect your working tree.
#
# This does not currently work with submodules!
# This will abort if a suspected submodule is found.
# You will have to delete them first
# and re-clone them after (with `git submodule update --init`)
#
# Error codes:
# 1: If a url is not supplied, and one cannot be read from .git/config
# 4: If the url cannot be reached
# 5: If a git submodule is detected


if [[ "$(find -name .git -not -path ./.git | wc -l)" -gt 0 ]] ;
then
    echo "It looks like this repo uses submodules" >&2
    echo "You will need to remove them before this script can safely execute" >&2
    echo "Then use \`git submodule update --init\` to re-clone them" >&2
    exit 5
fi

if [[ $# -ge 1 ]] ;
then
    url="$1"
else
    if ! url="$(git config --local --get remote.origin.url)" ;
    then
        echo "Unable to find remote 'origin': missing in '.git/config'" >&2
        exit 1
    fi
fi
url_base="$(echo "${url}" | sed -E 's;^([^/]*://)?([^/]*)(/.*)?$;\2;')"
echo "Attempting to access ${url_base} before continuing"
if ! wget -p "${url_base}" -O /dev/null -q --dns-timeout=5 --connect-timeout=5 ;
then
    echo "Unable to reach ${url_base}: Aborting before any damage is done" >&2
    exit 4
fi

echo
echo "This operation will replace the local repo with the remote at:"
echo "${url}"
echo
echo "This will completely rewrite history,"
echo "but will leave your working tree intact"
echo -n "Are you sure? (y/N): "

read confirm
if ! [ -t 0 ] ; # i'm open in a pipe
then
    # print the piped input
    echo "${confirm}"
fi
if echo "${confirm}"|grep -Eq "[Yy]+[EeSs]*" ; # it looks like a yes
then
    if [[ -e .git ]] ;
    then
        # remove old backup
        rm -vrf .git_old | tail -n 1 &&
        # backup .git iff it exists
        mv -v .git .git_old
    fi &&
    git init &&
    git remote add origin "${url}" &&
    git config --local --get remote.origin.url | sed 's/^/Added remote origin at /' &&
    git fetch &&
    git reset origin/master --mixed
else
    echo "Aborting without doing anything"
fi

3
น่าทึ่งฉันได้สำรองข้อมูลโครงการและลองใช้วิธีแก้ปัญหาของคุณ Git เสียหายค่อนข้างแย่ ฉันลองใช้วิธีแก้ปัญหาของคุณแล้วและได้ผลดีขอบคุณมาก
kequc

2
ไม่ได้ใช้สคริปต์ขณะที่ฉันใช้ Windows แต่คำสั่งเหล่านั้นเพิ่งบันทึกโฟลเดอร์. git ของฉันที่แสดง repo ใหม่สำหรับการบันทึกทุกครั้งที่ทำในไฟล์ที่ติดตาม (ดังนั้นฉันจึงลงเอยด้วยที่เก็บข้อมูลหลัก 50 รายการก่อนที่ฉันจะลองแก้ไขนี้ )
จักรยานยนต์

1
ฉันสามารถกู้คืน.gitโฟลเดอร์ของฉันได้หลังจากทำสิ่งนี้ ผมพบว่าเป็นประโยชน์มากกว่าgit reset origin/master --hard --mixed
Felipe Alvarez

1
เยี่ยมมาก ในกรณีที่มี subudules ที่ไม่มีการเปลี่ยนแปลงให้ลบออกก่อนจากนั้นจึงทำการ init โมดูลย่อยเพื่อรับอีกครั้ง
Herm

1
@ w33haa ขออภัยโซลูชันนี้ใช้ได้เฉพาะในกรณีที่คุณมีที่เก็บระยะไกลที่ถูกต้องและสามารถเข้าถึงได้ คำตอบอื่น ๆ บางคำกล่าวถึงกรณีของรีโมตที่ไม่สามารถเข้าถึงได้หรือเสียหาย
Zoey Hewll

54

TL; ดร

Git ไม่ได้จัดเก็บประวัติอย่างที่คุณคิด จะคำนวณประวัติ ณ รันไทม์ตามห่วงโซ่บรรพบุรุษ หากบรรพบุรุษของคุณไม่มีหยดต้นไม้หรือสิ่งที่กระทำคุณอาจไม่สามารถกู้คืนประวัติของคุณได้ทั้งหมด

กู้คืนวัตถุที่หายไปจากการสำรองข้อมูล

สิ่งแรกที่คุณสามารถลองได้คือกู้คืนรายการที่หายไปจากการสำรองข้อมูล .git/objects/98/4c11abfc9c2839b386f29c574d9e03383fa589ยกตัวอย่างเช่นดูว่าคุณมีการสำรองข้อมูลของกระทำเก็บไว้เป็น หากเป็นเช่นนั้นคุณสามารถกู้คืนได้

คุณอาจต้องการตรวจสอบ git-Verify-packและgit-unpack-objectsในกรณีที่คอมมิตถูกบรรจุเรียบร้อยแล้วและคุณต้องการส่งคืนไปยังอ็อบเจ็กต์ที่หลวมเพื่อวัตถุประสงค์ในการผ่าตัดที่เก็บ

การผ่าตัด

หากคุณไม่สามารถแทนที่รายการที่ขาดหายไปจากข้อมูลสำรองคุณอาจสามารถตัดทอนประวัติที่ขาดหายไปได้ ตัวอย่างเช่นคุณอาจตรวจสอบประวัติหรือ reflog เพื่อค้นหาบรรพบุรุษของการกระทำ 984c11abfc9c2839b386f29c574d9e03383fa589 หากคุณพบว่ามีสภาพสมบูรณ์ให้ทำดังนี้

  1. คัดลอกไดเร็กทอรีการทำงาน Git ของคุณไปยังไดเร็กทอรีชั่วคราวที่ใดที่หนึ่ง
  2. ทำการฮาร์ดรีเซ็ตเป็นคอมมิตที่ไม่เสียหาย
  3. คัดลอกไฟล์ปัจจุบันของคุณกลับไปที่แผนผังงาน Git แต่อย่าคัดลอกโฟลเดอร์. git กลับ!
  4. ให้คำมั่นสัญญากับแผนผังงานปัจจุบันและพยายามอย่างเต็มที่เพื่อถือว่ามันเป็นการกระทำที่ขาดหายไปจากประวัติทั้งหมด

หากได้ผลคุณจะเสียประวัติการแทรกแซงแน่นอน ณ จุดนี้หากคุณมีบันทึกประวัติการทำงานคุณควรตัดประวัติของคุณและบันทึกข้อมูลการกระทำและวัตถุที่ไม่สามารถเข้าถึงได้ทั้งหมด

การกู้คืนและการเริ่มต้นใหม่ทั้งหมด

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

rm -rf .git
git init
git add .
git commit -m 'Re-initialize repository without old history.'

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


3
ฉันเพิ่งพบปัญหานี้และต้องการแจ้งให้ทราบเนื่องจากยังไม่อยู่ในคำตอบของคุณ แต่ปัญหาของฉันเป็นเพียงปัญหาการอนุญาตธรรมดา error: Could not read abcderepo ของฉันได้รับการจัดการโดย GitLab และกำลังสร้างไฟล์ที่ผู้ใช้ของฉันไม่สามารถอ่านได้ sudo chownต่อมาและฉันเป็นสิ่งที่ดีที่จะไป
Aust

Full Restores and Re-Initializationช่วยชีวิตฉันไว้ :) ฉันยังเรียกใช้git pull origin master --allow-unrelated-historiesเพื่อดึงรหัสเวอร์ชันล่าสุดจาก repo ระยะไกล
Sami

6

หากคุณมีการกำหนดค่าจากระยะไกลและคุณมี / ไม่สนใจว่าจะสูญเสียรหัสที่ไม่ได้รับการขัดจังหวะคุณสามารถทำได้:

git fetch && git reset --hard

2
ในบางกรณีคอมไพล์จะไม่อนุญาตให้คุณดึงข้อมูลหากวัตถุบางอย่างเสียหายดังนั้นคุณต้องเริ่มต้น repo ของคุณใหม่ก่อน
Zoey Hewll

fatal: pack has 13 unresolved deltasเรื่องนี้ไม่ได้ทำงานสำหรับฉันเมื่อฉันได้
Artem Russakovskii

5

นี่คือสคริปต์ (ทุบตี) เพื่อทำให้โซลูชันแรกโดยอัตโนมัติโดย @CodeGnome เพื่อกู้คืนจากข้อมูลสำรอง (เรียกใช้จากระดับบนสุดของ repo ที่เสียหาย) การสำรองข้อมูลไม่จำเป็นต้องสมบูรณ์เพียง แต่ต้องมีวัตถุที่ขาดหายไป

git fsck 2>&1 | grep -e missing -e invalid | awk '{print $NF}' | sort -u |
    while read entry; do
        mkdir -p .git/objects/${entry:0:2}
        cp ${BACKUP}/objects/${entry:0:2}/${entry:2} .git/objects/${entry:0:2}/${entry:2}
    done

4

ก่อนที่จะลองแก้ไขตามที่อธิบายไว้ในหน้านี้ฉันขอแนะนำให้ทำสำเนา repo ของคุณและดำเนินการกับสำเนานี้เท่านั้น จากนั้นในตอนท้ายหากคุณสามารถแก้ไขได้ให้เปรียบเทียบกับไฟล์ต้นฉบับเพื่อให้แน่ใจว่าคุณจะไม่สูญเสียไฟล์ใด ๆ ในกระบวนการซ่อมแซม

อีกทางเลือกหนึ่งที่ได้ผลสำหรับฉันคือการรีเซ็ตหัวคอมไพล์และดัชนีเป็นสถานะก่อนหน้าโดยใช้:

git reset --keep

คุณยังสามารถทำได้ด้วยตนเองโดยเปิด Git GUI แล้วเลือก "การเปลี่ยนแปลงตามขั้นตอน" แต่ละรายการแล้วคลิกที่ "ยกเลิกขั้นตอนการเปลี่ยนแปลง" เมื่อทุกอย่างไม่อยู่ในขั้นตอนนี้คุณควรจะบีบอัดฐานข้อมูลตรวจสอบฐานข้อมูลและคอมมิตได้แล้ว

ฉันลองใช้คำสั่งต่อไปนี้ด้วย แต่มันไม่ได้ผลสำหรับฉัน แต่อาจเหมาะกับคุณขึ้นอยู่กับปัญหาที่คุณมี:

git reset --mixed
git fsck --full
git gc --auto
git prune --expire now
git reflog --all

สุดท้ายเพื่อหลีกเลี่ยงปัญหาการซิงโครไนซ์ที่สร้างความเสียหายให้กับดัชนีคอมไพล์ของคุณ (ซึ่งอาจเกิดขึ้นกับ DropBox, SpiderOak หรือดิสก์คลาวด์อื่น ๆ ) คุณสามารถทำสิ่งต่อไปนี้:

  1. แปลง.gitโฟลเดอร์ของคุณเป็นไฟล์ git "บันเดิล" ไฟล์เดียวโดยใช้: git bundle create my_repo.git --allจากนั้นควรใช้งานได้เหมือนเดิม แต่เนื่องจากทุกอย่างอยู่ในไฟล์เดียวคุณจะไม่เสี่ยงต่อการซิงโครไนซ์ที่ทำลาย git repo ของคุณอีกต่อไป
  2. ปิดใช้งานการซิงโครไนซ์ทันที : SpiderOak ช่วยให้คุณสามารถตั้งเวลาสำหรับการตรวจสอบการเปลี่ยนแปลงเป็น "อัตโนมัติ" (ซึ่งหมายความว่าโดยเร็วที่สุดกำลังตรวจสอบการเปลี่ยนแปลงของไฟล์ด้วยการแจ้งเตือนของระบบปฏิบัติการ) สิ่งนี้ไม่ดีเนื่องจากจะเริ่มอัปโหลดการเปลี่ยนแปลงทันทีที่คุณทำการเปลี่ยนแปลงจากนั้นดาวน์โหลดการเปลี่ยนแปลงดังนั้นจึงอาจลบการเปลี่ยนแปลงล่าสุดที่คุณเพิ่งทำ วิธีแก้ไขปัญหานี้คือตั้งค่าความล่าช้าในการตรวจสอบการเปลี่ยนแปลงเป็น 5 นาทีขึ้นไป นอกจากนี้ยังแก้ไขปัญหาเกี่ยวกับแอพพลิเคชั่นบันทึกการจดบันทึกทันที (เช่น Notepad ++)

3

หากคุณหมดหวังคุณสามารถลองสิ่งนี้:

git clone ssh://me@my.git.server/path/to/project destination --depth=1

จะได้รับข้อมูลของคุณ แต่คุณจะสูญเสียประวัติ ฉันลองผิดลองถูกกับ repo และ--depth=10ได้ผล แต่--depth=50ก็ล้มเหลว


3

ฉันพยายามย้ายไฟล์อ็อบเจ็กต์ออกไปด้วย 0 ไบต์และดึงข้อมูลอีกครั้งจากรีโมตและใช้งานได้:

find . -type f -size 0 -exec mv {} /tmp \;
git fetch

มันดึงวัตถุที่หายไปจากรีโมทและอนุญาตให้ฉันทำงานต่อโดยไม่ต้องเริ่มต้น repo ใหม่ทั้งหมด


2

ฉันประสบปัญหาเดียวกันดังนั้นฉันจึงแทนที่โฟลเดอร์ ".git" ด้วยเวอร์ชันสำรองและยังใช้งานไม่ได้เนื่องจากไฟล์. gitconfig เสียหาย BSOD บนแล็ปท็อปของฉันเสียหาย ฉันแทนที่ด้วยรหัสต่อไปนี้และแหล่งข้อมูลเรียกคืนที่เก็บทั้งหมดของฉัน

[user]
name = *your username*
email = *your email address*
[core]
autocrlf = true
excludesfile = C:\\Users\\*user name*\\Documents\\gitignore_global.txt

ฉันไม่รู้ว่าวิธีนี้จะช่วยใครได้บ้าง แต่นี่เป็นเพียงอีกวิธีหนึ่งที่เหมาะกับฉัน



2

ฉันพบปัญหาที่คล้ายกันโดยใช้ git เวอร์ชัน 2.7.1 ภายใต้ Ubuntu 18.04.3 เมื่อเร็ว ๆ นี้ นี่คือวิธีที่ฉันทำ:

sudo apt install git-repair
git-repair  # fix a broken git repository
or
git-repair --force  # force repair, even if data is lost
git fsck  # to verify it was fixed

เวลาส่วนใหญ่กระบวนการกู้คืนประสบความสำเร็จ


git-repair เป็นเครื่องมือที่มีประโยชน์มาก มันช่วยฉันในการกู้คืนที่เก็บ ปัญหาของวิธีการอื่น ๆ ส่วนใหญ่คือคุณสูญเสียที่ซ่อนซึ่งไม่ใช่ทางเลือกสำหรับฉัน
ม.ค. Rychter

1

ในกรณีของฉันฉันกำลังสร้างที่เก็บจากซอร์สโค้ดแล้วในพีซีของฉันและข้อผิดพลาดนั้นก็ปรากฏขึ้น ฉันลบโฟลเดอร์. git และทำทุกอย่างอีกครั้งและใช้งานได้ :)


1

ฉันต้องการเพิ่มสิ่งนี้เป็นความคิดเห็นภายใต้คำตอบที่ยอดเยี่ยมของ Zoey Hewilด้านบน แต่ตอนนี้ฉันไม่มีตัวแทนเพียงพอที่จะทำเช่นนั้นฉันจึงต้องเพิ่มที่นี่และให้เครดิตสำหรับงานของเธอ: P

หากคุณใช้ Poshgit และรู้สึกขี้เกียจเป็นพิเศษคุณสามารถใช้สิ่งต่อไปนี้เพื่อแยก URL ของคุณจากการกำหนดค่าคอมไพล์โดยอัตโนมัติและทำให้งานง่าย ๆ ง่ายยิ่งขึ้น คำเตือนมาตรฐานใช้เกี่ยวกับการทดสอบสิ่งนี้ในสำเนา / สำรอง repo ในพื้นที่ของคุณก่อนในกรณีที่เกิดระเบิดขึ้นที่ใบหน้าของคุณ

$config = get-content .git\config
$url = $config -match " url = (?<content>.*)"
$url = $url.trim().Substring(6)
$url

move-item -v .git .git_old;
git init;
git remote add origin "$url";
git fetch;
git reset origin/master --mixed

0

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


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