2012-02-19 11 views
12

Przesłałem pliki z Project do Project/src. Git ma wrażenie, że usunąłem pliki z Project i utworzyłem nowe pliki w Project/src.Zamówienie wielu plików, które zostały przeniesione w drzewie roboczym

Ponadto mam wiele innych zmian w drzewie roboczym, które chcę zatwierdzić. My git status:


$ git status 
# On branch feature/cmake 
# Changes to be committed: 
# (use "git reset HEAD ..." to unstage) 
# 
# new file: .gitignore 
# new file: CMakeLists.txt 
# deleted: Wasa.xcodeproj/project.pbxproj 
# deleted: Wasa/Wasa.1 
# renamed: Wasa/main.cpp -> main.cpp 
# new file: src/CMakeLists.txt 
# Lots of new files listed here 
# 
# Changes not staged for commit: 
# (use "git add/rm ..." to update what will be committed) 
# (use "git checkout -- ..." to discard changes in working directory) 
# 
# modified: CMakeLists.txt 
# deleted: IODevice.h 
# Lots of deleted files listed here. 

Chciałbym unstage pliki źródłowe - *.{cpp,h}. Wiem, jak się otworzyć (na przykład pomocny może być link here). To, co chciałbym, aby uniknąć, robi pisząc wiele z git checkout <filename>.

Nie chcę płacić HEAD, ponieważ niektóre zmiany w drzewie roboczym chciałbym zachować. Próbowałem robić git checkout *.{cpp,h}, co daje następujące:


$ git checkout *.{cpp,h} 
zsh: no matches found: *.cpp 

Ponieważ pliki nie istnieją obecnie w drzewie roboczym, nie mogę ich sprawdzić bo *.{cpp,h} nie pasuje do żadnych plików.

Pliki są wszystkie w Project/src; jest prawdopodobnie regex lub coś, co mógłbym uruchomić z wyjściem ls src podłączonym do polecenia, ale chciałbym wiedzieć, czy git może zrobić to dla mnie sam. Czy istnieje sposób, w jaki mogę to zrobić w git?

Odpowiedz

27

Ucieczka *:

$ git checkout \*.{cpp,h} 
+0

Jeśli pliki istnieją w katalogu, git (lub może powłoka, nie jestem pewien) akceptuje '*. {Cpp, h}' i rozszerza go do wszystkich pasujących plików. Mój problem polega na tym, że nie * mam * pasujących plików; przenieśli się do 'src/*. {cpp, h}' i próbuję znaleźć leniwy sposób na kasowanie plików bez wpisywania 'git checkout ', 'git checkout ' itp. – simont

+0

Jeśli uciekniesz gwiazda, nie będzie pasować w powłoce. Po prostu spróbuj :-) – Irfy

+0

Heh. Mój błąd; zupełnie źle przeczytałem to, co napisałeś. To działa - dziękuję bardzo. – simont

2

Do sprawdzania wielu plików. Właśnie zaimplementowałem symbole wieloznaczne i działa to dobrze dla mnie. W przypadku niektórych plików prawdopodobnie potrzebowalibyśmy innej sztuczki.

użyłem:

git checkout -- *.*

w moim Git Bash. a wszystkie zmodyfikowane pliki w moim obszarze roboczym zostały zamienione na te w repozytorium.

Mam nadzieję, że pomoże, dzięki.

+0

Problem z tym jest dokładnie, co jest wskazane w przyjętej odpowiedzi, że '*' jest rozszerzony przez powłokę (bash, zsh ...) do wszystkich pasujących plików, które mogą być brakujące, jeśli zostały przeniesione/usunięte. Podczas gdy '\ * w tym kontekście jest rozszerzane przez' git' do plików, które są śledzone przez git to znaczy, że 'git add' został do nich zastosowany.Nawet jeśli pliki zostaną przeniesione/usunięte 'git checkout \ *' rozwinie się na te nazwy plików, dopóki nie podejmiesz ich przeniesienia/usunięcia. W rzeczywistości, aby zatwierdzić usunięcie pliku 'file.end', należy wykonać polecenie' git commit file.end', a mimo to plik ten nawet nie istnieje (ale na to git). –

+0

To prawda. Dzięki Jonatan. Przepraszam za noobness – Divesh

Powiązane problemy