Come tenere traccia dei contenuti non tracciati?


159

Vedi sotto la linea continua per la mia domanda originale.

Ho una cartella nella mia directory locale non tracciata. Quando corro git status, ottengo:

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

Quando scrivo, git add vendor/plugins/open_flash_chart_2quindi riprovare git status, dice ancora non tracciato. Cosa sta succedendo?


Ecco un semplice riassunto della mia ultima mezz'ora:

  • Ho scoperto che il mio repository Github non sta monitorando il mio vendor/plugins/open_flash_chart_2plugin. In particolare, non ci sono contenuti e mostra una freccia verde sull'icona della cartella.

  • Provato git submodule init

    No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2'
    
  • Provato 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)
    
  • .gitmodulesHo cercato qualsiasi file nominato nel mio repository / directory locale ma non sono riuscito a trovarne uno.

Cosa devo fare per far funzionare i miei sottomoduli in modo che Git possa iniziare a tracciare correttamente?


Questo potrebbe non essere correlato (lo includo nel caso in cui aiuti), ma ogni volta che scrivo git commit -apiuttosto che il solito git commit -m "my comments", genera un errore:

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:

Sono un principiante completo in Github e nonostante provi a leggere la documentazione, sono un po 'sconcertato da questi problemi particolari. Grazie.


2
Sono confuso su alcune cose. Uno: perché continui a dire github? tutto ciò di cui stai parlando sembra locale (tranne quella freccia verde - non ne so nulla). È giusto o è una domanda sulla trasmissione degli aggiornamenti a Github? Due: hai davvero fatto qualcosa per creare questo plugin come sottomodulo? Un sottomodulo è un repository git a sé stante. Lo crei separatamente, quindi lo aggiungi nel superprogetto.
Cascabel,

1
Hm, l'output dello stato git suggerisce che c'è davvero un sottomodulo lì ... ma davvero non hai un file .gitmodules? Onestamente, se questo plugin ha il suo repository e sai quale versione vuoi, puoi semplicemente rimuovere quella directory dal tuo progetto, assicurarti che non ci sia alcuna voce in .gitmodules e passare attraverso l'installazione del sottomodulo: git submodule add, git submodule update --init.
Cascabel,

Jefromi - In realtà non ho menzionato Github più di due volte - la prima volta è perché la freccia verde appare in cima all'immagine della cartella gialla nel repository Github effettivo per open_flash_chart_2. Modificherò felicemente la risposta per renderla più chiara.
sscirrus,

1
@sscirrus: dovresti assolutamente avere una preferenza, sottomodulo o no. Se questa è una cosa esterna su cui non hai intenzione di lavorare, ma da cui potresti volere aggiornamenti, dovrebbe essere un sottomodulo. Se non ti interessa ottenere aggiornamenti dal suo repository originale e potresti voler hackerare il sorgente da solo, non dovrebbe essere un sottomodulo.
Cascabel,

1
Questa domanda sembra riguardare esclusivamente i sottomoduli git. Ho rimosso alcuni tag perché questa domanda non è direttamente correlata a rotaie o github, si applicherebbe a tutti i casi d'uso di git . E il trackingtag sembra essere utilizzato per gli argomenti di "tracciamento dei visitatori del sito Web", quindi non si applicherebbe neanche.
edgerunner,

Risposte:


239

Hai aggiunto vendor/plugins/open_flash_chart_2la voce "gitlink", ma non l'hai mai definita come sottomodulo. In effetti stai usando la funzione interna che usa git submodule (voci gitlink) ma non stai usando la funzione sottomodule stessa.

Probabilmente hai fatto qualcosa del genere:

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

Quest'ultimo comando è il problema. La directory vendor/plugins/open_flash_chart_2inizia come repository Git indipendente. Di solito tali sotto-repository vengono ignorati, ma se si dice a git add di aggiungerlo in modo esplicito, verrà creata una voce gitlink che punta al commit HEAD del repository invece di aggiungere il contenuto della directory. Potrebbe essere bello se git add si rifiuta di creare tali "semi-sottomoduli".

Le directory normali sono rappresentate come oggetti albero in Git; gli oggetti albero danno nomi e autorizzazioni agli oggetti che contengono (di solito altri oggetti albero e BLOB, rispettivamente directory e file). I sottomoduli sono rappresentati come voci "gitlink"; Le voci gitlink contengono solo il nome oggetto (hash) del commit HEAD del sottomodulo. Il “repository di origine” per il commit di un gitlink è specificato nel .gitmodulesfile (e nel .git/configfile una volta inizializzato il sottomodulo).

Quello che hai è una voce che punta a un particolare commit, senza registrare il repository di origine per quel commit. Puoi risolvere questo problema trasformando il tuo gitlink in un sottomodulo appropriato, oppure rimuovendo il gitlink e sostituendolo con contenuto "normale" (file e directory semplici).

Trasformalo in un sottomodulo appropriato

L'unico bit mancante da definire correttamente vendor/plugins/open_flash_chart_2come sottomodulo è un .gitmodulesfile. Normalmente (se non lo avessi già aggiunto come voce gitlink nuda), useresti semplicemente git submodule add:

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

Come hai trovato, questo non funzionerà se il percorso esiste già nell'indice. La soluzione è rimuovere temporaneamente la voce gitlink dall'indice e quindi aggiungere il sottomodulo:

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

Questo utilizzerà il tuo repository esistente (ovvero non clonerà nuovamente il repository di origine) e metterà in scena un .gitmodulesfile simile al seguente:

[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

Inoltre, inserirà una voce simile nel repository principale .git/config(senza pathimpostazione).

Commettilo e avrai un sottomodulo adeguato. Quando clonate il repository (o spingete su GitHub e clonate da lì), dovreste essere in grado di reinizializzare il sottomodulo tramite git submodule update --init.

Sostituiscilo con contenuto semplice

Il passaggio successivo presuppone che il proprio sotto-repository vendor/plugins/open_flash_chart_2non abbia alcuna cronologia locale che si desidera conservare (ovvero, tutto ciò che ci interessa è l'albero di lavoro corrente del sottopository, non la cronologia).

Se si dispone della cronologia locale nel repository di cui si è interessati, è necessario eseguire il backup della .gitdirectory del repository prima di eliminarla nel secondo comando di seguito. (Considera anche l' esempio di sottostruttura git che segue che conserva la cronologia di HEAD del repository).

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

Questa volta quando si aggiunge la directory, non si tratta di un repository, quindi i file verranno aggiunti normalmente. Sfortunatamente, poiché abbiamo eliminato la .gitdirectory non esiste un modo semplicissimo per mantenere le cose aggiornate con il repository di origine.

In alternativa, potresti prendere in considerazione l'utilizzo di un'unione di sottostruttura . Ciò ti consentirà di estrarre facilmente le modifiche dal repository di origine mantenendo i file "piatti" nel tuo repository (senza sottomoduli). Il comando di sottotree git di terze parti è un buon wrapper per la funzionalità di unione delle sottostrutture.

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

Dopo:

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 ha anche --squashun'opzione che ti consente di evitare di incorporare la cronologia del repository di origine nella cronologia ma ti consente comunque di inserire le modifiche a monte.


Chris, ho appena provato rm -rf vendor/plugins/open_flash_chart_2/.gite dice "rm" non è riconosciuto. Poi ho provato git rm -rf vendor/plugins/open_flash_chart_2/.gite ha detto fatal: pathspec 'vendor/plugins/open_flash_chart_2/.git' did not match any files(ma posso arrivarci in Windows Explorer!).
sscirrus,

2
Abbiamo discusso un po 'del problema in chat . L'OP è stato in grado di rimuovere .gitla directory del repository e aggiungere nuovamente i file "in modo piatto" (la prima opzione "Contenuto normale").
Chris Johnsen,

1
Questo mi ha salvato il culo così tanto l'altro giorno. Avevo aggiunto accidentalmente qualcosa con una directory .git in esso al mio repository git, e poi git in un certo senso pensava che avesse un sottomodulo, che stava causando il mio git svn dcommits per dare di matto. Se potessi, ti voterei 3 volte.
davidtbernal,

Vuoi puntare, il plugin di terze parti subtreenon deve essere confuso con l'unione delle sottostrutture. Non è un involucro. L'autore dice così: P
NebulaFox,

@NebulaFox: Sebbene git subtree non sia solo un wrapper per le fusioni di sottostrutture, utilizza certamente le stesse tecniche della procedura standard di "fusione delle sottostrutture" (vale a dire git readtree --prefix=pathe le fusioni delle sottostrutture: git mergecon -s subtreeo-Xsubtree=path ). Ha anche dei bei extra "in alto": la --squashmodalità, il splitcomando e gli aiutanti pushe pull.
Chris Johnsen,

114

Ho appena avuto lo stesso problema. Il motivo era perché c'era una sottocartella che conteneva una cartella ".git". Rimuoverlo ha reso felice Git.


Sì, questo è successo a me in AndroidStudio. Il repository git era già stato creato nella cartella / app mentre provavo a creare un repository git di una cartella. Grazie.
Zircon,

Avevo creato un'app angolare cli sotto molte altre cartelle e quella in una cartella aveva una cartella .git: / Questo è il vero problema non sottomettere roba!
Pascal,

questo funziona per me ... Ho provato ad aggiungere git molte volte, ma non è successo niente. quindi rimuovo la .gitcartella
Ninja il

1
E se volessi ancora tracciare la mia sottocartella? Cosa dovrei fare ?
cyber8200,

Hanno lo stesso caso. Voglio ancora rintracciare quella sottocartella che purtroppo conteneva anche una cartella .git. Dopo aver eliminato questa cartella .git della cartella secondaria non viene più rintracciata nella mia cartella .git principale .... :(
sqp_125


6

Per sottolineare cosa ho dovuto scavare fuori dalla chat di Chris Johansen con OP (collegato da una risposta a una risposta):

git add vendor/plugins/open_flash_chart_2 # aggiungerà gitlink, il contenuto rimarrà non monitorato

git add vendor/plugins/open_flash_chart_2/ # AVVISO LO SLASH !!!!

Il secondo modulo lo aggiungerà senza gitlink e i contenuti sono tracciabili. La directory .git viene comodamente e automaticamente ignorata. Grazie Chris!


5

Uso il trucco suggerito da Peter Lada per tutto il tempo, soprannominato "falso sottomodulo":

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

È molto utile in diversi scenari (pe lo uso per mantenere tutte le mie configurazioni di Emacs in un repository, incluso l'attuale HEAD di tutti i repository git all'interno delle directory dei pacchetti elpa / el-get, in modo da poter facilmente tornare indietro / avanti a un noto versione funzionante quando qualche aggiornamento interrompe qualcosa).



3

Ho avuto lo stesso problema con un grande progetto con molti sottomoduli. Sulla base delle risposte di Chris Johnsen qui e VonC qui ho creato un breve script bash che scorre tutte le voci di gitlink esistenti e le aggiunge come sottomoduli appropriati.

#!/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"

Ciò ha risolto il problema per me, spero che sia di aiuto.


2

Questo ha funzionato bene per me:

git update-index --skip-worktree

Se non funziona con il nome percorso, prova il nome file. Fammi sapere se questo ha funzionato anche per te.

Ciao!


1

Ha avuto lo stesso problema, ma non è stato risolto in questa discussione.

Ho anche riscontrato il problema del sottomodulo come descritto nell'apertura del thread.

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

Guardando il diff ho riconosciuto un -dirty aggiunto a un hash: leggere di nuovo i documenti, risolto il problema per me. http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html Guarda la sezione "Insidie ​​con sottomoduli"

Il motivo era che nel sottomodulo c'erano cambiamenti o contenuti non tracciati. Ho dovuto prima accedere alla directory del sottomodulo, fare un "git add" + "git commit" per ottenere tutto il contenuto tracciato all'interno del sottomodulo.

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

Ora questo nuovo HEAD dal sottomodulo potrebbe essere trasferito al modulo master.


1

Di recente ho riscontrato questo problema mentre lavoravo a un progetto a contratto (ritenuto classificato). Il sistema in cui dovevo eseguire il codice non aveva accesso a Internet, ovviamente per motivi di sicurezza, e quindi installare dipendenze, usando compositore e npm, stava diventando un grande dolore.

Dopo molte discussioni con il mio collega, abbiamo deciso di limitarci a copiare e incollare le nostre dipendenze anziché fare l'installazione del compositore o l'installazione di npm.

Questo ci ha portato a NON aggiungere venditori e npm_modules in gitignore. Questo è quando ho riscontrato questo problema.

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

Ho cercato su Google un po 'e ho trovato questo thread utile su SO. Non essendo troppo un professionista in Git, ed essendo un po 'ubriaco mentre ci lavoravo, ho appena cercato tutti i sottomoduli nella cartella dei fornitori

find . -name ".git"

Questo mi ha dato alcune dipendenze di 4-5 che ne avevano il coraggio. Ho rimosso tutte queste cartelle .git e voilà, ha funzionato. So che è hack, e comunque non molto geek. O Dei di SO, per favore perdonami! La prossima volta prometto di leggere su gitlink e obbedire a O potente Linus Tovalds.


1

A questa domanda è già stata data una risposta, ma ho pensato di aggiungere al mix ciò che ho scoperto quando ho ricevuto questi messaggi.

Ho un repository chiamato playgroundche contiene una serie di app sandbox. Ho aggiunto due nuove app da un tutorial alla playgrounddirectory clonando il repository del tutorial. Il risultato è stato che le cose git delle nuove app puntavano al repository del tutorial e non al mio repository. La soluzione era eliminare la .gitdirectory da ciascuna delle directory di quelle app, le directory mvdelle app esterne alla playgrounddirectory, e poi mvtornare indietro ed eseguire git add .. Dopodiché ha funzionato.


1

Ho risolto questo problema eliminando il file .git dalla mia sottocartella.

  1. Prima cancella il file .git dalla tua sottocartella
  2. Quindi rimuovere la sottocartella da git eseguendo questo codice, git rm -rf --cached your_subfolder_name
  3. Quindi aggiungi nuovamente la tua cartella con git add. comando

0

Per prima cosa vai alla Directory : vendor / plugins / open_flash_chart_2 e DELETE


POI :

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

git status  

PRODUZIONE

Su filiale principale La
filiale è aggiornata con "origine / master".
niente da impegnare, directory di lavoro pulita

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.