2011-09-12 14 views
13

Rozdzielam repozytorium Git za pomocą opcji --subdirectory-filter gałęzi filtru, która działa świetnie, z wyjątkiem tego, że pobiera wszystko do katalogu głównego repozytorium.Filtr podkatalogu Git z istniejącą strukturą katalogów

Obecnie mam

ABC 
    - DEF 
     - GHI 
     - JKL 
    - MNO 

A wynik tego polecenia:

git filter-branch -f --subdirectory-filter ABC/DEF --prune-empty -- --all 

Generuje to:

GHI 
JKL 

Gdzie czego naprawdę chcę to:

ABC 
    - DEF 
     - GHI 
     - JKL 

Nie widzę niczego w dokumentach Git, które pokazuje opcję filtrowania, która zachowuje (lub ustawia) strukturę katalogów i nie byłem w stanie znaleźć polecenia. Mogę uruchomić po filtrowaniu w celu zmapowania struktury jak tego chcę.

Czy to możliwe?

Odpowiedz

3

Znalazłem odpowiedź here, która rozwiązuje problem.

Polecenie:

git filter-branch -f --index-filter 'git ls-files -s \ 
| sed "s-\t-&ABC/DEF/-" \ 
| GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info \ 
&& mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' 

działa idealnie

+1

Pracowałem doskonale też dla mnie. Dziękujemy za przesłanie wiadomości. Dodam, że to polecenie nie zastępuje polecenia '--subdirectory-filter'; nadal to robisz. To polecenie zastępuje polecenie 'git mv * ...' zalecane przez inne dokumenty. Ale bez brzydkiego, masowego zatwierdzenia wygenerowałby 'git mv'. –

+0

Niestety to nie działa dla mnie. Używam git-bash w systemie Windows i nie mogę powiedzieć, że nie można znaleźć pliku index.new ($ GIT_INDEX_FILE.new). Chciałbym móc skorzystać z tego rozwiązania. –

+0

@BerinLoritsch $ GIT_INDEX_FILE jest zmienną środowiskową, którą większość używanych przeze mnie narzędzi ustawia dla ciebie; Zarówno MsysGit, jak i CygWin wraz z kilkoma wersjami git dla Windows. Jaka jest twoja dokładna konfiguracja? – JRoughan

1

Mam tylko pobieżnie Testowanie podano ten sam, ale myślę, że można użyć git filter-branch z --tree-filter przepisać oddział, ale usunięcie wszystkich plików z wyjątkiem tych, w podkatalogu ABC/DEF, z czymś, co następuje:

git filter-branch --tree-filter \ 
    'find . -path ./ABC/DEF -prune -o -type f -print0 | xargs -0 rm -f' \ 
    --prune-empty HEAD 

Zauważ, że polecenie find usuwa tylko pliki, nie katalogi, ale ponieważ git nie przechowuje pustych katalogów, powinno to spowodować uzyskanie pożądanego wyniku.

+0

Dzięki za to. Z wielkością tego repozytorium naprawdę potrzebuję czegoś, co działa poza indeksem (filtr indeksu zamiast filtra drzewa). Twoja odpowiedź jest zdecydowanie na dobrej drodze, ale w mojej sytuacji byłaby bardzo powolna. Znalazłem odpowiedź, ale nie jestem pewna, czy etykieta akceptuje moją własną odpowiedź, kiedy to prawdopodobnie pasuje do większości przypadków. – JRoughan

+0

[Zachęcam do odpowiedzi na własne pytanie] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/) i jeśli to rozwiązana odpowiedź Twoje pytanie też powinieneś zaakceptować. Musisz jednak [czekać 48 godzin] (http://blog.stackoverflow.com/2009/01/accept-your-own-answers/). Polecenie '--tree-filter', które przetestowałem powyżej, było rzeczywiście dość powolne, ale zazwyczaj z odgałęzieniem filtru jest to sytuacja jednorazowa, więc nie obchodzi mnie, czy będę musiała wyjść z niej na noc ... –

Powiązane problemy