Jak śledzić nieśledzone treści?

159

Poniżej ciągła linia dla mojego pierwotnego pytania.

Mam folder w moim katalogu lokalnym, który nie jest śledzony. Kiedy biegam git status, otrzymuję:

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

Kiedy piszę, git add vendor/plugins/open_flash_chart_2a potem próbuję git statusponownie, nadal jest napisane „nieśledzone”. Co się dzieje?


Oto proste podsumowanie mojego ostatniego pół godziny:

  • Odkryłem, że moje repozytorium Github nie śledzi mojej vendor/plugins/open_flash_chart_2wtyczki. W szczególności nie ma zawartości i pokazuje zieloną strzałkę na ikonie folderu.

  • Wypróbowany git submodule init

    No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2'
    
  • Wypróbowany 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)
    
  • Poszukiwany dla dowolnego pliku wymienionego .gitmodulesw moim katalogu repozytorium / lokalnym, ale nie mogłem go znaleźć.

Co muszę zrobić, aby moje moduły podrzędne działały, aby git mógł prawidłowo rozpocząć śledzenie?


Może to być niezwiązane (dołączam to na wypadek, gdyby to pomogło), ale za każdym razem, gdy piszę, git commit -aa nie jak zwykle git commit -m "my comments", generuje błąd:

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:

Jestem kompletnym nowicjuszem w Github i pomimo prób przejrzenia dokumentacji, jestem trochę zaskoczony tymi konkretnymi problemami. Dziękuję Ci.

sscirrus
źródło
2
Jestem zdezorientowany w kilku sprawach. Po pierwsze: dlaczego ciągle mówisz „github”? wszystko, o czym mówisz, brzmi lokalnie (poza tą zieloną strzałką - nic o tym nie wiem). Czy to prawda, czy też jest to kwestia wysyłania aktualizacji na github? Po drugie: czy faktycznie zrobiłeś coś, aby utworzyć tę wtyczkę jako moduł podrzędny? Moduł podrzędny to samo w sobie repozytorium git. Tworzysz go osobno, a następnie dodajesz do superprojektu.
Cascabel
1
Hm, wynik statusu git sugeruje, że rzeczywiście istnieje moduł podrzędny ... ale naprawdę nie masz pliku .gitmodules? Szczerze mówiąc, jeśli ta wtyczka ma własne repozytorium i wiesz, jakiej wersji chcesz, możesz po prostu usunąć ten katalog ze swojego projektu, upewnić się, że nie ma wpisu w .gitmodules i przejść przez konfigurację modułu podrzędnego: git submodule add, git submodule update --init.
Cascabel
Jefromi - właściwie nie wspomniałem o Githubie więcej niż dwa razy - za pierwszym razem zielona strzałka pojawia się na górze żółtego obrazu folderu w rzeczywistym repozytorium Github dla open_flash_chart_2. Z przyjemnością edytuję odpowiedź, aby była jaśniejsza.
sscirrus
1
@sscirrus: Zdecydowanie powinieneś mieć preferencje, podmoduł czy nie. Jeśli jest to zewnętrzna rzecz, nad którą nie będziesz pracować, ale z której możesz chcieć aktualizacji, powinien to być moduł podrzędny. Jeśli nie zależy Ci na pobieraniu aktualizacji z oryginalnego repozytorium i możesz chcieć samodzielnie włamać się do źródła, nie powinien to być moduł podrzędny.
Cascabel
1
Wydaje się, że to pytanie dotyczy wyłącznie podmodułów git. Usunąłem kilka tagów, ponieważ to pytanie nie jest bezpośrednio związane z railsami ani githubem, dotyczyłoby wszystkich przypadków użycia gita . A trackingtag wydaje się być wykorzystywane do śledzenia strony internetowej „gość” tematów, tak że nie będzie mieć zastosowania.
edgerunner

Odpowiedzi:

239

Dodano vendor/plugins/open_flash_chart_2wpis „gitlink”, ale nigdy nie zdefiniowałeś go jako podmodułu. Skutecznie używasz wewnętrznej funkcji używanej przez git submodule (wpisy gitlink), ale nie używasz samej funkcji submodułu.

Prawdopodobnie zrobiłeś coś takiego:

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

To ostatnie polecenie jest problemem. Katalog vendor/plugins/open_flash_chart_2zaczyna się jako niezależne repozytorium Git. Zwykle takie repozytoria podrzędne są ignorowane, ale jeśli powiesz git add, aby jawnie je dodał, utworzy wpis gitlink, który wskazuje na zatwierdzenie HEAD repozytorium podrzędnego, zamiast dodawać zawartość katalogu. Byłoby miło, gdyby git add odmówił tworzenia takich „półmodułów”.

Normalne katalogi są reprezentowane jako obiekty drzewa w Git; obiekty drzewa nadają nazwy i uprawnienia do obiektów, które zawierają (zwykle inne obiekty drzewa i obiekty blob - odpowiednio katalogi i pliki). Podmoduły są reprezentowane jako wpisy „gitlink”; Wpisy gitlink zawierają tylko nazwę obiektu (hash) zatwierdzenia HEAD podmodułu. „Repozytorium źródłowe” zatwierdzenia gitlink jest określone w .gitmodulespliku (i .git/configpliku po zainicjowaniu modułu podrzędnego ).

To, co masz, to wpis wskazujący na określone zatwierdzenie, bez rejestrowania repozytorium źródłowego dla tego zatwierdzenia. Możesz to naprawić, zmieniając gitlink we właściwy moduł podrzędny lub usuwając gitlink i zastępując go „normalną” zawartością (zwykłe pliki i katalogi).

Zmień go w odpowiedni moduł podrzędny

Jedynym bitem, którego brakuje, aby poprawnie zdefiniować vendor/plugins/open_flash_chart_2jako moduł podrzędny, jest .gitmodulesplik. Zwykle (jeśli nie dodałeś go jeszcze jako wpis samego gitlink), po prostu użyjesz git submodule add:

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

Jak ustaliłeś, to nie zadziała, jeśli ścieżka już istnieje w indeksie. Rozwiązaniem jest tymczasowe usunięcie wpisu gitlink z indeksu, a następnie dodanie submodułu:

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

Spowoduje to wykorzystanie istniejącego repozytorium podrzędnego (tj. Nie spowoduje ponownego sklonowania repozytorium źródłowego) i przygotuje .gitmodulesplik, który wygląda następująco:

[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

Spowoduje to również utworzenie podobnego wpisu w głównym repozytorium .git/config(bez pathustawienia).

Zatwierdź to, a będziesz miał odpowiedni moduł podrzędny. Po sklonowaniu repozytorium (lub wypchnięciu do GitHub i sklonowaniu stamtąd) powinno być możliwe ponowne zainicjowanie modułu podrzędnego za pośrednictwem git submodule update --init.

Zastąp go zwykłą treścią

Następny krok zakłada, że ​​twoje repozytorium podrzędne w vendor/plugins/open_flash_chart_2nie ma żadnej lokalnej historii, którą chcesz zachować (tj. Wszystko, na czym Ci zależy, to bieżące drzewo robocze repozytorium podrzędnego, a nie historia).

Jeśli masz historię lokalną w repozytorium podrzędnym, na którym Ci zależy, powinieneś wykonać kopię zapasową .gitkatalogu repozytorium podrzędnego przed usunięciem go w drugim poleceniu poniżej. ( Weź również pod uwagę poniższy przykład poddrzewa git, który zachowuje historię HEAD repozytorium podrzędnego).

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

Tym razem podczas dodawania katalogu nie jest to repozytorium podrzędne, więc pliki zostaną dodane normalnie. Niestety, ponieważ usunęliśmy .gitkatalog, nie ma super łatwego sposobu na aktualizację repozytorium źródłowego.

Zamiast tego możesz rozważyć użycie scalania poddrzewa . Pozwoli ci to łatwo pobrać zmiany z repozytorium źródłowego, zachowując „płaskie” pliki w repozytorium (bez modułów podrzędnych). Trzecia partia- git poddrzewa komenda jest ładny otoki wokół funkcjonalności subtree seryjnej.

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

Później:

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 [email protected]:me/my_ofc2_fork.git changes_for_pull_request

Poddrzewo git ma również --squashopcję, która pozwala uniknąć włączania historii repozytorium źródłowego do historii, ale nadal umożliwia pobieranie zmian.

Chris Johnsen
źródło
Chris, właśnie spróbowałem rm -rf vendor/plugins/open_flash_chart_2/.giti jest napisane, że „rm” nie jest rozpoznawane. Potem spróbowałem git rm -rf vendor/plugins/open_flash_chart_2/.giti powiedział fatal: pathspec 'vendor/plugins/open_flash_chart_2/.git' did not match any files(ale mogę się tam dostać w Eksploratorze Windows!).
sscirrus
2
Omówiliśmy nieco problem na czacie . OP był w stanie usunąć katalog sub-repozytorium .giti ponownie dodać pliki „na płasko” (pierwsza opcja „Zwykła zawartość”).
Chris Johnsen,
1
To tak bardzo uratowało mi tyłek poprzedniego dnia. Przypadkowo dodałem coś z katalogiem .git do mojego repozytorium git, a następnie git kinda-sorta pomyślał, że ma podmoduł, co powodowało, że moje git svn dcommits oszalały. Głosowałbym za tobą 3 razy, gdybym mógł.
davidtbernal
Chcę zwrócić uwagę, że wtyczki innej firmy subtreenie należy mylić z scalaniem poddrzewa. To nie jest opakowanie. Autor tak mówi: P
NebulaFox
@NebulaFox: Chociaż poddrzewo git nie jest tylko opakowaniem wokół scalania poddrzewa, z pewnością używa tych samych technik, co standardowa procedura „scalania poddrzewa” (tj. git readtree --prefix=pathI poddrzewo łączy się: git mergez -s subtreelub-Xsubtree=path ). Ma też fajne dodatki „na wierzchu”: --squashtryb, splitpolecenie pushoraz pullpomocniki i .
Chris Johnsen,
114

Po prostu miałem ten sam problem. Przyczyną było to, że istniał podfolder zawierający folder „.git”. Usunięcie go sprawiło, że był szczęśliwy.

neoneye
źródło
Tak, zdarzyło mi się to w AndroidStudio. Repozytorium git zostało już utworzone w folderze / app, gdy próbowałem utworzyć repozytorium git o jeden folder wyżej. Dzięki.
ZirconCode
Miałem aplikację utworzoną przez angular cli w wielu innych folderach i ten jeden folder miał folder .git: / To jest prawdziwy problem, a nie elementy submodułu!
Pascal
to działa dla mnie ... Próbowałem dodać git wiele razy, ale nic się nie stało. potem usuwam .gitfolder
Ninja
1
Ale co, jeśli nadal chcę śledzić mój podfolder? Co powinienem zrobić ?
cyber8200
Miej ten sam przypadek. Nadal chcę śledzić ten podfolder, który niestety zawierał również folder .git. Po usunięciu tego folderu sufolder .git nie jest on już śledzony w moim głównym folderze .git .... :(
sqp_125
14
  1. Usunąłem katalogi .git z tych nowych katalogów (może to stworzyć dramat podmodułowy. W razie zainteresowania wygoogluj).
  2. Następnie uruchomiłem git rm -rf --cached / the / new / directories
  3. Następnie ponownie dodałem katalogi za pomocą gita add. z góry

Adres URL odniesienia https://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U

user2041369
źródło
6

Aby wskazać, co musiałem wykopać z czatu Chrisa Johansena z OP (link z odpowiedzi do odpowiedzi):

git add vendor/plugins/open_flash_chart_2 # doda gitlink, zawartość pozostanie nieśledzona

git add vendor/plugins/open_flash_chart_2/ # ZWRÓĆ UWAGĘ NA SLASH !!!!

Druga forma doda go bez gitlinka, a zawartość będzie można śledzić. Katalog .git jest wygodnie i automatycznie ignorowany. Dziękuję Chris!

Peter Lada
źródło
5

Cały czas używam sztuczki zaproponowanej przez Petera Ladę, nazwanej „fałszywymi podmodułami”:

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

Jest to bardzo przydatne w kilku scenariuszach (używam go do przechowywania całej mojej konfiguracji Emacsa w repozytorium, w tym aktualnego HEAD wszystkich repozytoriów git wewnątrz katalogów pakietów elpa / el-get, więc mogę łatwo cofnąć / przekazać do znanego wersja działająca, gdy jakaś aktualizacja coś zepsuje).

Eloici
źródło
3

http://progit.org/book/ch6-6.html

Myślę, że powinieneś to przeczytać, aby dowiedzieć się trochę o module podrzędnym. Jest dobrze napisany i przeczytanie go nie zajmuje dużo czasu.

rmk
źródło
3

Miałem ten sam problem z dużym projektem z wieloma podmodułami. Na podstawie odpowiedzi Chrisa Johnsena tutaj i VonC tutaj buduję krótki skrypt bash, który iteruje przez wszystkie istniejące wpisy gitlink i dodaje je jako odpowiednie podmoduły.

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

To naprawiło to dla mnie, mam nadzieję, że to pomoże.

nicolas
źródło
2

To zadziałało dobrze dla mnie:

git update-index --skip-workktree

Jeśli to nie działa ze ścieżką, wypróbuj nazwę pliku. Daj mi znać, jeśli to też zadziałało.

PA!

DarkCrazy
źródło
1

Miałem ten sam problem, ale nie został on rozwiązany w tej dyskusji.

Trafiłem też w problem z submodułem, jak opisano przy otwieraniu wątku.

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

Patrząc na różnicę, rozpoznałem -dirty dołączony do hasha: ponowne przeczytanie dokumentów rozwiązało problem za mnie. http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html Zajrzyj do sekcji „Pułapki związane z modułami podrzędnymi”

Powodem było to, że w module podrzędnym nastąpiły zmiany lub nieśledzona zawartość. Najpierw musiałem dostać się do katalogu podmodułów, wykonać polecenie „git add” + „git commit”, aby cała zawartość była śledzona w module podrzędnym.

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

Teraz ta nowa HEAD z modułu podrzędnego może zostać przypisana do modułu głównego.

nero
źródło
1

Niedawno napotkałem ten problem podczas pracy nad projektem kontraktowym (uznanym za tajny). System, w którym musiałem uruchamiać kod, nie miał dostępu do internetu, oczywiście ze względów bezpieczeństwa, więc instalowanie zależności z wykorzystaniem composera i npm stawało się ogromnym problemem.

Po długich naradach z moim kolegą zdecydowaliśmy się po prostu go wyskoczyć i skopiować i wkleić nasze zależności, zamiast wykonywać instalację kompozytora lub instalację npm.

To spowodowało, że NIE dodawaliśmy dostawców i npm_modules w gitignore. Wtedy właśnie napotkałem ten problem.

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

Przeszukałem to trochę w Google i znalazłem ten pomocny wątek na SO. Nie będąc zbyt profesjonalnym w Git i będąc trochę odurzonym podczas pracy nad tym, po prostu szukałem wszystkich podmodułów w folderze dostawców

find . -name ".git"

To dało mi jakieś 4-5 zależności, które się na nich pojawiły. Usunąłem wszystkie te foldery .git i voila, zadziałało. Wiem, że to hack, i tak nie jest zbyt geekowy. O bogowie, proszę, wybaczcie mi! Następnym razem obiecuję przeczytać o gitlinkach i być posłusznym O potężnemu Linusowi Tovalds.

SLearner
źródło
1

Na to pytanie udzielono już odpowiedzi, ale pomyślałem, że dodam do mieszanki to, czego dowiedziałem się, gdy otrzymałem te wiadomości.

Mam repozytorium, playgroundktóre zawiera kilka aplikacji piaskownicy. Dodałem dwie nowe aplikacje z samouczka do playgroundkatalogu, klonując repozytorium samouczka. W rezultacie rzeczy git nowych aplikacji wskazywały na repozytorium samouczka, a nie na moje repozytorium. Rozwiązaniem było usunięcie .gitkatalogu z każdego z katalogów tych aplikacji, katalogów mvaplikacji poza playgroundkatalogiem, a następnie mvprzywrócenie ich i uruchomienie git add .. Potem zadziałało.

Dana Scheider
źródło
1

Rozwiązałem ten problem, usuwając plik .git z mojego podfolderu.

  1. Najpierw usuń plik .git z podfolderu
  2. Następnie usuń podfolder z gita, uruchamiając ten kod, git rm -rf --cached nazwa_podfolderu
  3. Następnie ponownie dodaj swój folder przez git add. Komenda
MehediTCF
źródło
0

Najpierw przejdź do katalogu : vendor / plugins / open_flash_chart_2 i DELETE


NASTĘPNIE :

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

git status  

WYNIK

W
Twoim oddziale Twój oddział jest na bieżąco z 'origin / master'.
nic do zatwierdzenia, katalog roboczy czysty

Program-Me-Rev
źródło