2010-10-28 16 views
50

Mam projekt pod numerem git. Pewnego dnia przeniosłem wszystkie pliki projektu z bieżącego katalogu do foo/bar/ w ramach projektu. Zrobiłem to za pomocą git mv. Następnie dodałem trochę więcej plików i dokonałem pewnych zmian w już istniejących plikach.Jak mogę przepisać historię, aby wszystkie pliki, z wyjątkiem tych, które już zostały przeniesione, znajdują się w podkatalogu?

W rezultacie teraz, gdy patrzę na historię foo/bar/file.c, widzę tylko zmiany, które wprowadziłem po przeniesieniu pliku.

Próbowałem naprawić to na różne sposoby (filter-branch z filtrem podkatalogów, itp.), Ale nic nie pomogło, więc jestem całkiem spiętrzony tutaj. Docenię każdą pomoc, jaką możesz mi dać. Dzięki!

Odpowiedz

85

przepisać historię z plikami przeniesione:

Jeśli chcesz historia projektu wyglądają tak, jakby wszystkie pliki były zawsze w katalogu foo/bar, to trzeba zrobić trochę operację. Użyj git filter-branch z „drzewa” filtr do przepisać zobowiązuje, tak aby nigdzie foo/bar nie istnieje, to jest tworzony i wszystkie pliki są przenoszone do niego:

git filter-branch --prune-empty --tree-filter ' 
if [ ! -e foo/bar ]; then 
    mkdir -p foo/bar 
    git ls-tree --name-only $GIT_COMMIT | xargs -I files mv files foo/bar 
fi' 

Teraz historia będzie zapisany tak, jakby wszystkie pliki były zawsze z lokalizacją foo/bar.

Aby zobaczyć historię przeniósł pliku:

Jeśli chcesz tylko zobaczyć historię pliku, który został przeniesiony lub zmieniona w pewnym momencie w przeszłości, a potem po prostu należy wybrać opcję --follow do git log:

+1

@Alexander: Możesz spróbować umieścić jednolinijkę (wszystko w pojedynczym cudzysłowie) w prawdziwym skrypcie, z linią bash. Myślę, że 'filter-branch' prawdopodobnie próbuje uruchomić to w' sh', a nie 'bash'. – Cascabel

+0

Poczyniłem pewne postępy. Wygląda na to, że podwójne nawiasy w instrukcji if powodowały ten błąd. Pojedyncze nawiasy działają lepiej, ale nadal nie działa. Problem polega na tym, że zanim przeniosłem wszystko do foo/bar/I miałem katalog o nazwie foo z pewną zawartością w projekcie. Teraz narzeka "nie może przenieść" foo "do podkatalogu samego siebie,' foo/bar/foo '". –

+0

@Alexander: Będziesz musiał odpowiednio dostosować skrypt. Coś jak: 'if [[! -e foo/bar]]; następnie mkdir -p foo/bar; git ls-tree - tylko -name $ GIT_COMMIT | grep -v^foo $ | xargs -I pliki mv foo/bar; fi' Używa polecenia grep do odfiltrowania 'foo' z listy plików do przeniesienia. Zauważ, że zakładam również, że podkatalog "bar" nigdy nie istniał, dopóki nie przeniosłeś wszystkiego pod nim. Jeśli tak nie jest, musisz również uwzględnić to w skrypcie. –

6

Zawijam tutaj krótkie podsumowanie tego, co zrobiłem. Komenda, który pracował dla mnie było:

if [ ! -e foo/bar ]; then mkdir -p foo/bar; git ls-tree --name-only $GIT_COMMIT | grep -v ^foo$ | xargs -I files mv files foo/bar || echo ""; fi 

echo poleceń, które dodałem na koniec zapewnił, że nawet gdy nie cała komenda mv będzie kontynuować bieg. Nie przesuwało zawartości foo/bar/foo, ale mogę z tym żyć.

Wielkie dzięki za Dan Moulding (!!!) i Jefromi za pomoc.

Powiązane problemy