İzlenmeyen içerik nasıl izlenir?


159

Orijinal sorum için düz çizginin altına bakın.

Yerel dizinimde izlenmeyen bir klasör var. Koştuğumda git status, anladım:

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

Ben yazarken git add vendor/plugins/open_flash_chart_2sonra deneyin git statustekrar, hala izlenmeyen diyor. Neler oluyor?


İşte son yarım saatimin basit bir özeti:

  • Github Repo'mun vendor/plugins/open_flash_chart_2eklentimi takip etmediğini keşfetti . Özellikle, içerik yoktur ve klasör simgesinde yeşil bir ok gösterir.

  • Denenmiş git submodule init

    No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2'
    
  • Denenmiş git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

    vendor/plugins/open_flash_chart_2 already exists in the index
    
  • git status

    modified: vendor/plugins/open_flash_chart_2 (untracked content)
    
  • Depom .gitmodules/ yerel dizinimdeki herhangi bir dosya için avlandı, ancak bir dosya bulunamadı.

Git'in izlemeye başlayabilmesi için alt modüllerimin çalışması için ne yapmam gerekir?


Bu ilgisiz olabilir (yardımcı olması durumunda dahil ederim), ancak her git commit -azamanki yerine yazdığım her seferinde git commit -m "my comments"bir hata atar:

E325: ATTENTION
Found a swap file by the name ".git\.COMMIT-EDITMSG.swp"
         dated: Thu Nov 11 19:45:05 2010
     file name: c:/san/project/.git/COMMIT_EDITMSG
      modified: YES
     user name: San   host name: San-PC
    process ID: 4268
While opening file ".git\COMMIT_EDITMSG"
         dated: Thu Nov 11 20:56:09 2010
  NEWER than swap file!  
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

Ben Github tam bir acemi ve belgeleri geçmeye çalışmasına rağmen, bu özel sorunları biraz şaşırmış. Teşekkür ederim.


2
Birkaç şey hakkında kafam karıştı. Bir: neden github diyorsun? bahsettiğiniz her şey yerel geliyor (bu yeşil ok hariç - bunun hakkında hiçbir şey bilmiyorum). Bu doğru mu, yoksa güncellemeleri github'a aktarmayla ilgili bir soru mu? İki: Aslında bu eklentiyi alt modül olarak oluşturmak için herhangi bir şey yaptınız mı? Bir alt modül, kendi başına bir git deposudur. Ayrı olarak oluşturursunuz, sonra süper projeye eklersiniz.
Cascabel

1
Hm, git durumunun çıktısı orada gerçekten bir alt modül olduğunu gösteriyor ... ama gerçekten .gitmodules dosyanız yok mu? Dürüst olmak gerekirse, bu eklentinin kendi repo'su varsa ve hangi sürümünü istediğinizi biliyorsanız, bu dizini projenizden kaldırabilir, .gitmodules'de herhangi bir giriş olmadığından emin olabilir ve alt modül kurulumundan geçebilirsiniz: git submodule add, git submodule update --init.
Cascabel

Jefromi - Aslında Github'dan iki kereden fazla bahsetmedim - ilk kez yeşil ok, open_flash_chart_2 için gerçek Github deposundaki sarı klasör görüntüsünün üstünde görünmesi. Cevabı daha açık hale getirmek için memnuniyetle düzenleyeceğim.
sscirrus

1
@sscirrus: Kesinlikle bir tercihiniz olmalı, alt modülünüz olsun ya da olmasın. Bu, üzerinde çalışmayacağınız ancak güncellemelerini isteyebileceğiniz harici bir şeyse, bir alt modül olmalıdır. Orijinal deposundan güncelleme almayı umursamıyorsanız ve kaynağı kendiniz kesmek istiyorsanız, bir alt modül olmamalıdır.
Cascabel

1
Bu soru tamamen git submodülleriyle ilgili gibi görünüyor. Bu soru doğrudan raylar veya github ile ilgili olmadığı için bazı etiketleri kaldırdım, tüm git kullanım durumları için geçerli olacaktır . Ve trackingetiket 'web sitesi ziyaretçi takibi' konuları için kullanılmış gibi görünüyor, bu yüzden de geçerli olmayacak.
edgerunner

Yanıtlar:


239

Sen eklemiş vendor/plugins/open_flash_chart_2“gitlink” girişi olarak değil, bir alt modülün olarak tanımlanan olmadı. Etkili olarak git alt modülünün kullandığı dahili özelliği kullanıyorsunuz (gitlink girdileri) ancak alt modül özelliğinin kendisini kullanmıyorsunuz.

Muhtemelen böyle bir şey yaptınız:

git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2

Bu son komut sorun. Dizin vendor/plugins/open_flash_chart_2bağımsız bir Git deposu olarak başlar. Genellikle bu tür alt depoları göz ardı edilir, ancak söylesem git eklenti açıkça eklemek için, o zaman alt deponun HEAD işaret dizinin içeriğini eklemek yerine taahhüt dair bir gitlink giriş oluşturulur. Git add'in böyle bir "yarı alt modüller" oluşturmayı reddetmesi hoş olabilir .

Normal dizinler Git'te ağaç nesneleri olarak gösterilir; ağaç nesneleri içerdikleri nesnelere adlar ve izinler verir (genellikle diğer ağaç ve blob nesneleri - sırasıyla dizinler ve dosyalar). Alt modüller “gitlink” girdileri olarak temsil edilir; gitlink girdileri yalnızca alt modülün HEAD komutunun nesne adını (hash) içerir. Bir gitlink komutunun “kaynak deposu” .gitmodulesdosyada (ve .git/configalt modül başlatıldıktan sonra dosyada) belirtilir.

Sahip olduğunuz şey, söz konusu taahhüdün kaynak deposunu kaydetmeden belirli bir taahhüdün işaretidir. Bu, gitlink'inizi uygun bir alt modüle dönüştürerek veya gitlink'i kaldırıp "normal" içerikle (düz dosyalar ve dizinler) değiştirerek düzeltebilirsiniz.

Uygun Bir Modüle Dönüştürün

vendor/plugins/open_flash_chart_2Bir alt modül olarak düzgün bir şekilde tanımlamak için eksik olan tek bit bir .gitmodulesdosyadır. Normalde (daha önce çıplak gitlink girişi olarak eklemediyseniz) şunu kullanırsınız git submodule add:

git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

Bulduğunuz gibi, yol zaten dizinde varsa bu çalışmaz. Çözüm, gitlink girişini geçici olarak dizinden kaldırmak ve sonra alt modülü eklemektir:

git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

Bu, mevcut alt havuzunuzu kullanır (yani kaynak veri havuzunu yeniden klonlamaz) ve .gitmodulesşöyle görünen bir dosya hazırlar:

[submodule "vendor/plugins/open_flash_chart_2"]
    path = vendor/plugins/open_flash_chart_2
    url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

Aynı zamanda ana havuzunuzda da benzer bir giriş yapar .git/config( pathayar olmadan ).

Bunu taahhüt edin ve uygun bir alt modüle sahip olacaksınız. Havuzu klonladığınızda (veya GitHub'a itip oradan klonla), alt modülü yeniden başlatabilmeniz gerekir git submodule update --init.

Düz İçerikle Değiştir

Bir sonraki adım, alt deponuzun vendor/plugins/open_flash_chart_2korumak istediğiniz herhangi bir yerel geçmişe sahip olmadığını varsayar .

Önem verdiğiniz alt depoda yerel geçmişiniz varsa, .gitaşağıdaki ikinci komutta silmeden önce alt havuzun dizinini yedeklemelisiniz . (Ayrıca , alt deponun HEAD geçmişini koruyan git alt ağacı örneğini de göz önünde bulundurun ).

git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2

Bu kez dizin eklenirken, bir alt depo değildir, bu nedenle dosyalar normal şekilde eklenir. Ne yazık ki, .gitdizini sildiğimizden beri kaynak havuzuyla işleri güncel tutmanın çok kolay bir yolu yoktur.

Bunun yerine bir alt ağaç birleştirme kullanmayı düşünebilirsiniz . Bunu yaptığınızda, dosyaları deponuzda “düz” tutarken (alt modül olmadan) kaynak havuzdaki değişiklikleri kolayca çekebilirsiniz. Üçüncü taraf git subtree komutu , alt ağaç birleştirme işlevselliği etrafında hoş bir pakettir.

git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history

Sonra:

git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master

git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request

git subtree ayrıca, --squashkaynak havuzun geçmişini geçmişinize eklemekten kaçınmanıza izin veren, ancak yine de yukarı akış değişikliklerini çekmenizi sağlayan bir seçeneğe sahiptir .


Chris, sadece denedim rm -rf vendor/plugins/open_flash_chart_2/.gitve 'rm' tanınmadığını söylüyor. Sonra denedim git rm -rf vendor/plugins/open_flash_chart_2/.gitve dedi fatal: pathspec 'vendor/plugins/open_flash_chart_2/.git' did not match any files(ama ben windows explorer oraya!).
sscirrus

2
Sorunu sohbet sırasında biraz tartıştık . OP, alt havuzun yönünü kaldırabildi .gitve dosyaları "düz" (ilk "Düz İçerik" seçeneği) yeniden ekledi.
Chris Johnsen

1
Bu geçen gün kıçımı çok kurtardı. Yanlışlıkla benim git repo içine bir .git dizini ile bir şey ekledi ve sonra git kinda-sorta benim git svn dcommits ucube neden oldu bir alt modül olduğunu düşündüm. Eğer yapabilseydim seni 3 kez tekrar ederdim.
davidtbernal

Üçüncü taraf eklentisi subtree, alt ağaç birleştirme ile karıştırılmamalıdır. Sarıcı değil. Yazar öyle diyor: P
NebulaFox

@NebulaFox: git subtree yalnızca alt ağaç birleşmelerinin etrafındaki bir paket olmasa da, standart “alt ağaç birleştirme” yordamıyla aynı teknikleri kullanır (yani git readtree --prefix=pathve alt ağaç birleşimleri : git mergeile -s subtreeveya-Xsubtree=path ). “Üstte” de güzel ekstralar var: --squashmod, splitkomut ve pushve pullyardımcıları.
Chris Johnsen

114

Ben de aynı problemi yaşadım. Bunun nedeni, ".git" klasörü içeren bir alt klasör bulunmasıydı. Kaldırmak git mutlu oldu.


Evet, bu AndroidStudio'da başıma geldi. Git repo bir klasör yukarı oluşturmaya çalışırken git repo zaten / app klasöründe oluşturulmuştu. Teşekkürler.
ZirconCode

Diğer birçok klasör altında bir açısal cli oluşturulan uygulaması vardı ve bir klasör bir .git klasörü vardı: / Bu gerçek bir sorun değil alt modül şeyler!
Pascal

bu benim için çalışıyor ... Git birçok kez eklemek denedim, ama hiçbir şey olmadı. sonra .gitklasörü kaldırırım
Ninja

1
Peki ya hala alt klasörümü izlemek istersem? Ne yapmalıyım ?
cyber8200

Aynı davaya sahip olun. Ne yazık ki bir .git klasörü içeren alt klasörü hala izlemek istiyorum. Bu sufolder .git klasörünü sildikten sonra artık ana .git klasörümde izlenmiyor .... :(
sqp_125


6

Chris Johansen'in OP ile yaptığı sohbetten ne çıkarmam gerektiğini belirtmek için (bir yanıttan cevaba bağlı olarak):

git add vendor/plugins/open_flash_chart_2 # gitlink ekleyecek, içerik izlenmeyecek

git add vendor/plugins/open_flash_chart_2/ # DİKKAT SLASH !!!!

İkinci form, gitlink olmadan ekler ve içerik izlenebilir. .Git dizini uygun ve otomatik olarak yoksayılır. Teşekkürler Chris!


5

Peter Lada'nın önerdiği hileyi her zaman "sahte alt modüller" olarak adlandırıyorum:

http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb

Çeşitli senaryolarda çok kullanışlıdır (pe, tüm Emacs yapılandırmamı elpa / el-get paket dizinleri içindeki tüm git depolarının mevcut HEAD'i de dahil olmak üzere bir depoda tutmak için kullanıyorum, böylece bilinen / Bazı güncelleme bir şey kırdığında çalışma sürümü).



3

Aynı problemi birçok alt modüllü büyük bir projeyle yaşadım. Cevaplarından dayanarak Chris Johnsen burada ve VonC burada ben tüm mevcut gitlink girişler arasında dolaşır ve uygun submodüller olarak ekler kısa bash komut dosyası oluşturmak.

#!/bin/bash

# Read all submodules in current git
MODULES=`git ls-files --stage | grep 160000`

# Iterate through every submodule path
while read -r MOD; do
  # extract submodule path (split line at whitespace and take string with index 3)
  ARRIN=(${MOD})
  MODPATH=${ARRIN[3]}

  # grep module url from .git file in submodule path
  MODURL=`grep "url = " $MODPATH/.git/config`
  MODURL=${MODURL##*=}

  # echo path and url for information
  echo $MODPATH
  echo $MODURL

  # remove existing entry in submodule index
  git rm --cached $MODPATH
  # add new entry in submodule index
  git submodule add $MODURL $MODPATH
done <<< "$MODULES"

Bu benim için düzeltildi, umarım herhangi bir yardımcı olur.


2

Bu benim için iyi sonuç verdi:

git update-index --skip-worktree

Yol adıyla çalışmazsa, dosya adını deneyin. Bunun sizin için de işe yarayıp yaramadığını bana bildirin.

Hoşçakal!


1

Aynı sorun vardı, ama bu tartışmada çözülmedi.

Ayrıca iplik açıklığında açıklandığı gibi alt modül sorununa çarptım.

% git status          
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (untracked content)

Farkı gördüğümde, bir karmaya eklenen bir dizini tanıdım: Dokümanları tekrar okumak, problemi benim için çözdü. http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html "Alt modüllerle tuzaklar" bölümüne bakın.

Nedeni, alt modülde değişiklikler veya izlenmemiş içerik olmasıydı. İlk önce alt modül dizini var, alt modül içinde izlenen tüm içeriği almak için bir "git add" + "git commit" yapmak zorunda kaldı.

Then "git status" on the master stated
% git commit
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (new commits)

Artık alt modülden gelen bu yeni HEAD, ana modüle işlenebilir.


1

Kısa bir süre önce bir sözleşme projesi üzerinde çalışırken (sınıflandırılmış sayılır) bu sorunla karşılaştım. Kodu çalıştırmak zorunda kaldığım sistem, elbette güvenlik amacıyla internet erişimine sahip değildi ve bu yüzden besteci ve npm kullanarak bağımlılıkları kurmak çok acı çekiyordu.

Meslektaşımla çok fazla müzakere ettikten sonra, besteci kurulumu veya npm kurulumu yapmak yerine sadece bağımlılığımızı kopyalayıp yapıştırmaya karar verdik.

Bu bize gitignore satıcıları ve npm_modules eklememize yol açtı. Bu sorunla karşılaştığım zamandır.

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

Bu biraz googled ve so üzerinde bu yararlı iş parçacığı bulundu. Git'te çok fazla profesyonel olmamak ve üzerinde çalışırken biraz sarhoş olmak, sadece satıcılar klasöründeki tüm alt modülleri aradım

find . -name ".git"

Bu bana gitmiş olan 4-5 bağımlılık verdi. Tüm bu .git klasörlerini ve voila'ları kaldırdım, işe yaradı. Bunun hack olduğunu biliyorum ve zaten çok geeky değil. Ey SO tanrıları, lütfen beni affet! Bir dahaki sefere gitlinks'i okumaya ve O güçlü Linus Tovalds'a itaat etmeye söz veriyorum.


1

Bu soru zaten cevaplandı, ancak bu mesajları aldığımda öğrendiklerimi karışıma ekleyeceğimi düşündüm.

playgroundSandbox uygulamaları içeren bir repo var . Öğreticinin playgrounddeposunu klonlayarak öğreticiden dizine iki yeni uygulama ekledim . Sonuç olarak, yeni uygulamaların git şeyler öğreticinin repo'suna işaret ediyordu ve repoma değil. Çözüm, .gitdizini bu uygulamaların dizinlerinden, mvdizin dışındaki uygulama dizinlerinden silmek playgroundve ardından mvgeri çalıştırmak ve çalıştırmaktı git add .. Bundan sonra işe yaradı.


1

Bu sorunu alt klasörümden .git dosyasını silerek çözdüm.

  1. Önce .git dosyasını alt klasöründen silin
  2. Ardından bu kodu çalıştırarak alt klasörünüzü git'ten kaldırın , git rm -rf --cubfolder_name'inizi önbelleğe aldı
  3. Sonra tekrar git add ile klasörünüzü ekleyin. komuta

0

Önce Dizine gidin : vendor / plugins / open_flash_chart_2 ve DELETE


SONRA :

git rm --cached vendor/plugins/open_flash_chart_2  
git add .  
git commit -m "Message"  
git push -u origin master  

git status  

ÇIKTI

Şube yöneticisi hakkında
Şubeniz 'orijin / master' ile güncel.
taahhüt edilecek bir şey yok, çalışma dizini temiz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.