Ağaç yinelenen dosya girdileri içerir

barındırma ile ilgili bazı sorunlardan sonra Git depomuzu Github'a taşımaya karar verdik. Bu yüzden depoyu klonladım ve bunu Github'a itmeye çalıştım. Ancak, daha önce hiç karşılaşmadığımız bazı hatalar üzerine tökezledim:

 C:\repositories\appName [master]> git push -u origin master
 Counting objects: 54483, done.
 Delta compression using up to 2 threads.
 Compressing objects: 100% (18430/18430), done.
 error: object 9eac1e639bbf890f4d1d52e04c32d72d5c29082e:contains duplicate file entries
 fatal: Error in object
 fatal: sha1 file '<stdout>' write error: Invalid arguments
 error: failed to push some refs to 'ssh://[email protected]/User/Project.git'

çalıştırdığımda fsck :

C:\repositories\appName [master]> git fsck --full
Checking object directories: 100% (256/256), done.
error in tree 0db4b3eb0e0b9e3ee41842229cdc058f01cd9c32: contains duplicate file entries
error in tree 9eac1e639bbf890f4d1d52e04c32d72d5c29082e: contains duplicate file entries
error in tree 4ff6e424d9dd2e3a004d62c56f99e798ac27e7bf: contains duplicate file entries
Checking objects: 100% (54581/54581), done.

kötü SHA1 ile ls-tree çalıştırdığımda:

C:\repositories\appName [master]> git ls-tree 9eac1e639bbf890f4d1d52e04c32d72d5c29082e
160000 commit 5de114491070a2ccc58ae8c8ac4bef61522e0667  MenuBundle
040000 tree 9965718812098a5680e74d3abbfa26f527d4e1fb    MenuBundle

bu üzerinde verilen tüm cevapları denedim StackOverflow soru , ama herhangi bir başarı olmadı. Bu depoyu ve tarihinin mahkum olmasını engelleyebilmemin bir yolu var mı?

24
tarihinde sordu Community 2012-11-01 18:03:39
kaynak

3 ответов

Yöntem 1.

ilk git fsck yapmak.

$ git fsck --full
error in tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29: contains duplicate file entries

bu sorunu çözmezse, başın belada demektir. Sorunu görmezden gelebilir, depoyu yedeklemeden geri yükleyebilir veya dosyaları yeni depoya taşıyabilirsiniz. Repo'yu github'a iterek sorun yaşıyorsanız, depoyu farklı bir şekilde değiştirmeyi deneyin veya kontrol edin: GitHub hatasına İtemez: paket nesneleri 13 sinyalinden öldü ve github için yeni git deposu itemez .


aşağıdaki yöntemler yalnızca gelişmiş git kullanıcıları içindir . Başlamadan önce Yedekleme yapın. Düzeltme aşağıdaki adımlarla garanti edilmez ve daha da kötüleştirebilir, bu nedenle kendi riskiniz veya eğitim amaçlarınız için yapın.


Yöntem 2.

tanımlamak için git ls-tree kullanın dosyaları çoğaltın.

$ git read-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 # Just a hint.
$ git ls-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 # Try also with: --full-tree -rt -l
160000 commit def08273a99cc8d965a20a8946f02f8b247eaa66  commerce_coupon_per_user
100644 blob 89a5293b512e28ffbaac1d66dfa1428d5ae65ce0    commerce_coupon_per_user
100644 blob 2f527480ce0009dda7766647e36f5e71dc48213b    commerce_coupon_per_user
100644 blob dfdd2a0b740f8cd681a6e7aa0a65a0691d7e6059    commerce_coupon_per_user
100644 blob 45886c0eda2ef57f92f962670fad331e80658b16    commerce_coupon_per_user
100644 blob 9f81b5ca62ed86c1a2363a46e1e68da1c7b452ee    commerce_coupon_per_user

gördüğünüz gibi, çoğaltılmış dosya girdileri (commerce_coupon_per_user) içerir!

$ git show bb81a5af7e9203f36c3201f2736fca77ab7c8f29
tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29

commerce_coupon_per_user
commerce_coupon_per_user
commerce_coupon_per_user
commerce_coupon_per_user
commerce_coupon_per_user
commerce_coupon_per_user

tekrar, çoğaltılmış dosya girdilerini görebilirsiniz (commerce_coupon_per_user)!

listelenen her blob için git show kullanmayı deneyebilir ve her dosya varsa içeriği kontrol edebilirsiniz.

sonra bu geçersiz ls-tree için ls-tree çalışmaya devam geçerli nesneyi izleyebilir veya tüm kırık olup olmadığını görmek için farklı git klonlar arasında nesne.

git ls-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29

If you found the valid object containing non-duplicated file entries, save it into the file and re-create by using `git mktree` and `git replace`, e.g.

remote$ git ls-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 > working_tree.txt
$ cat working_tree.txt | git mktree
NEWTREEbb81a5af7e9203f36c3201f2736fca77ab7c8f29
$ git replace bb81a5af7e9203f36c3201f2736fca77ab7c8f29 NEWTREE4b825dc642cb6eb9a060e54bf8d69288fbee4904

bu yardımcı olmazsa, değişikliği

ile geri alabilirsiniz
$ git replace -d NEWTREE4b825dc642cb6eb9a060e54bf8d69288fbee4904

yöntem 3.

hangi dosya/dir girdisinin çoğaltıldığını bildiğinizde, bu dosyayı kaldırmaya ve daha sonra yeniden yaratmaya çalışabilirsiniz. Örnek olarak:

$ find . -name commerce_coupon_per_user # Find the duplicate entry.
$ git rm --cached `find . -name commerce_coupon_per_user` # Add -r for the dir.
$ git commit -m'Removing invalid git entry for now.' -a
$ git gc --aggressive --prune # Deletes loose objects! Please do the backup before just in case.

daha fazlasını oku:


yöntem 4.

geçersiz girişler için taahhüt kontrol edin.

tekrar ağaç kontrol sağlar.

$ git ls-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 --full-tree -rt -l
160000 commit def08273a99cc8d965a20a8946f02f8b247eaa66  commerce_coupon_per_user
100644 blob 89a5293b512e28ffbaac1d66dfa1428d5ae65ce0     270    commerce_coupon_per_user
....
$ git show def08273a99cc8d965a20a8946f02f8b247eaa66
fatal: bad object def08273a99cc8d965a20a8946f02f8b247eaa66
$ git cat-file commit def08273a99cc8d965a20a8946f02f8b247eaa66
fatal: git cat-file def08273a99cc8d965a20a8946f02f8b247eaa66: bad file

yukarıdaki taahhüt geçersiz gibi görünüyor, neler olup bittiğini kontrol etmek için aşağıdaki komutlardan birini kullanarak bu taahhüt için git günlüğümüzü tarayalım:

$ git log -C3 --patch | less +/def08273a99cc8d965a20a8946f02f8b247eaa66
$ git log -C3 --patch | grep -C10 def08273a99cc8d965a20a8946f02f8b247eaa66

commit 505446e02c68fe306aec5b0dc2ccb75b274c75a9
Date:   Thu Jul 3 16:06:25 2014 +0100

    Added dir.

new file mode 160000
index 0000000..def0827
--- /dev/null
+++ b/sandbox/commerce_coupon_per_user
@@ -0,0 +1 @@
+Subproject commit def08273a99cc8d965a20a8946f02f8b247eaa66

bu özel durumda, taahhütümüz kötü nesneye işaret eder, çünkü artık mevcut olmayan git alt projesinin bir parçası olarak taahhüt edilmiştir ( git submodule status ).

bu geçersiz nesneyi ls ağacından dışlayabilir ve bu kötü nesne olmadan ağacı yeniden oluşturabilirsiniz:

$ git ls-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 | grep -v def08273a99cc8d965a20a8946f02f8b247eaa66 | git mktree
b964946faf34468cb2ee8e2f24794ae1da1ebe20

$ git replace bb81a5af7e9203f36c3201f2736fca77ab7c8f29 b964946faf34468cb2ee8e2f24794ae1da1ebe20

$ git ls-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 # Re-test.
$ git fsck -full

not: eski nesne hala yinelenen dosya girdilerini atmalıdır, ancak şimdi yeni ağaçta çiftleri varsa, o zaman ihtiyacınız o ağaçtan daha fazla şey çıkarmak için. Yani:

$ git replace # List replace objects.
bb81a5af7e9203f36c3201f2736fca77ab7c8f29
$ git replace -d bb81a5af7e9203f36c3201f2736fca77ab7c8f29 # Remove previously replaced object.

şimdi tüm taahhütleri ve blob'ları o ağaçtan kaldırmaya çalışalım ve değiştir tekrar:

$ git ls-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 | grep -ve commit -e blob | git mktree
4b825dc642cb6eb9a060e54bf8d69288fbee4904
$ git replace bb81a5af7e9203f36c3201f2736fca77ab7c8f29 4b825dc642cb6eb9a060e54bf8d69288fbee4904

şimdi geçersiz giriş için boş bir ağaç var.

$ git status # Check if everything is fine.
$ git show 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Re-check
$ git ls-tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 --full-tree # Re-check

sahne için bazı garip değişiklikleriniz varsa, deponuzu

ile sıfırlayın
$ git reset HEAD --hard

aşağıdaki hataya sahipseniz:

HEAD is now at 5a4ed8e Some message at bb81a5af7e9203f36c3201f2736fca77ab7c8f29

rebase yapın ve bu işlemi kaldırın ( pick ile edit arasında değiştirerek ):

$ git rebase -i
$ git commit -m'Fixed invalid commit.' -a
rebase in progress; onto 691f725
You are currently editing a commit while rebasing branch 'dev' on '691f725'.
$ git rebase --continue
$ git reset --hard
$ git reset HEAD --hard
$ git reset origin/master --hard

yöntem 5.

geçersiz nesneleri içeren geçersiz taahhütleri kaldırmayı ve ezmeyi deneyin.

$ git rebase -i HEAD~100 # 100 commits behind HEAD, increase if required.

daha fazlasını oku: Git Tools-Rewriting History ve belirli bir taahhüt atlarken nasıl yeniden oluştururum?


yöntem 6.

geçersiz git nesnelerini manuel kaldırma için aşağıdaki yöntemlerle tanımlama:

  • sıkıştırılmamış nesneler için (*ilk iki karakteri kaldırın, git dizin adı için kullandığı gibi):

    $ find . -name 81a5af7e9203f36c3201f2736fca77ab7c8f29
    
  • sıkıştırılmış nesneler için

    $ find . -name \*.idx -exec cat {} \; | git show-index | grep bb81a5af7e9203f36c3201f2736fca77ab7c8f29
    # Then you need to find the file manually.
    $ git unpack-objects $FILE # Expand the particular file.
    $ git unpack-objects < .git/objects/pack/pack-*.pack # Expand all.
    

bkz.: bir git deposunun tüm nesnelerini nasıl açabilirim?


ilgili:

5
cevap kenorb 2017-05-23 15:23:56
kaynak

rastladığım tek çözüm git-replace ve git-mktree kullanmaktır. Dünyanın en kolay çözümü değil, işe yarıyor.

bir referans kılavuzu için bu bağlantıya bakın.

git ağacı yinelenen dosya girdileri

içerir
1
cevap user3447739 2017-05-23 13:28:15
kaynak

not: Git 2.1 için iki seçenek katacak git replace bir git repo bozuk bir giriş değiştirirken yararlı olabilir:

bir nesnenin içeriğini etkileşimli olarak düzenleyin. Mevcut içerik <object> için geçici bir dosyaya oldukça yazdırılır, dosya üzerinde bir editör başlatılır ve sonuç <object> ile aynı türden yeni bir nesne oluşturmak için ayrıştırılır .

Daha sonra <object> yerine yeni oluşturulan nesne için yedek bir ref oluşturulur.

bkz. git-var Editörün nasıl seçileceği hakkında ayrıntılı bilgi için.

ve - 2deda62 tarafından Jeff King ( peff ) :

değiştir:

--edit için bir -- raw modu Ekle

" git replace --edit " amaçlarından biri, hatalı biçimlendirilmiş veya bozuk olan bir kullanıcı onarım nesnelerine yardımcı olmaktır.

Genellikle ham ikili verilerden çok daha kolay çalışmak için " ls-tree " ile ağaçları oldukça basıyoruz.

ancak, bazı formlar tabii ki, ağaç yürütücüsünü kırın, bu durumda pretty-printing başarısız olur, " --edit " kullanıcı için işe yaramaz.

bu yama, bu örneklerde ikili verileri düzenlemenizi sağlayan bir " --raw seçeneği sunar.

Jeff'in Git hata ayıklamak için nasıl kullanıldığını bilmek (bu durumda gibi ), bu seçeneği görmek için çok şaşırmadım.

0
cevap VonC 2014-08-03 23:59:57
kaynak

Diğer sorular git object duplicates