2010-11-08 2 views
37

Как я уже говорил, после изменения файлов и добавления новых файлов в мой репозиторий я обычно фиксировал файлы с git, но иногда мне нужны все измененные/измененные файлы, скопированные в папку для организации - я сам объясняю.Git: как получить все файлы и новые файлы в папке или zip?

Любой вариант?

+0

Если вы сообщите нам, что вы на самом деле пытаетесь выполнить, наши ответы могут быть немного полезнее. – Cascabel

+0

Это зависит, иногда просто от ftp их –

+0

Но «to ftp them» - это не цель сама по себе. В чем причина этого? Я никогда не хотел создавать zip только измененных файлов, поэтому мне интересно, как это сделать. –

ответ

48

Предполагая, что вы имеете в виду, что еще не сделали, и хотите упаковать все файлы, которые в настоящее время имеют локальные модификации, вы можете получить список измененных файлов с помощью git ls-files --modified. Если вы хотите файлы, которые были изменены последним фиксатором, вы можете использовать git diff --name-only HEAD^. Куда вы идете оттуда, зависит от вас. Примеры:

zip modified-files.zip $(git ls-files --modified) 
cp $(git ls-files --modified) ../modified-files 

Обратите внимание, что в настоящее время это использует версии файлов в рабочем дереве.

Если у вас есть пробелы в именах файлов, вам нужно будет немного побольше проблем.

(Конечно, в зависимости от того, что вы действительно пытаетесь сделать, возможно, вы ищете git stash, который отбрасывает все измененные файлы и оставляет вас с чистым рабочим деревом, или вы можете просто захотеть сделать временный ветвь для фиксации.)

+1

, это без коммитов, как я могу получить новые файлы. –

+0

Когда я говорю о новых файлах, которые есть перед добавлением их в репозиторий –

+2

Я думаю, что нашел то, что искал: cp $ (git ls-files --modified --others) измененные файлы. Большое спасибо. –

43

Чтобы сделать именно то, что вы просили (если вы уже совершенные и хотите создать архив файлов, измененных последней фиксации), вы можете сделать:

git archive --format=zip HEAD `git diff HEAD^ HEAD --name-only` > a.zip 

Если удаленные файлы в коммит , чтобы предотвратить pathspec использование ошибок --diff-filter=d:

git archive --format=zip HEAD `git diff --diff-filter=d HEAD^ HEAD --name-only` > a.zip 

Но, возможно, вы на самом деле хотите создать патч с помощью:

git diff HEAD^ HEAD > a.patch 

и применить этот патч, где вам это нужно с помощью:

patch -p1 < a.patch 

Конечно, применяя патч работает только, если ваш целевой каталог уже содержит старую версию хранилища.

+1

. Я рекомендую использовать 'git format-patch' вместо того, чтобы связывать' git diff' с файлом – knittl

+1

, это после того, как я начал использовать, как я могу получить новые файлы , –

+0

По новым файлам вы имеете в виду невоспроизводимые файлы в вашем рабочем каталоге? Ну, просто скажите нам, чего вы на самом деле хотите достичь. –

11

Если вы используете TortoiseGIt, он также предоставляет это.
Выберите папку, в проводнике
Щелкните правой кнопкой мыши, выберите меню, TortoiseGit-> Показать журнал.

Выберите рабочий каталог и последнюю измененную версию.
Щелкните правой кнопкой мыши. Сравните версии. Выберите файлы, которые вы хотите сохранить/экспортировать.
Щелкните правой кнопкой мыши. Экспортировать в папку. Готово.

+0

Вау .. это очень полезно .. спасибо @Aftershock ... – daxsorbito

+0

Желаю TortoiseGit инструмент экспорта позволил вам выбрать несколько коммитов. – Corgalore

0
mkdir -p /c/temp/blah && cp $(git diff <your commit hash> --name-only) /c/temp/blah 

Я использую Git Bash на окнах.

1

Вот сценарий, который может сделать этот процесс намного проще, он скопирует весь измененный файл в используемый определенный каталог и сохранит структуру каталогов базы кода.

пробег: sh scr.sh

==================================================================================================================================== ===

#!/bin/sh 
FILES=`git ls-files --modified` 
for x in $FILES 
do 
     prev_dir=$PWD 
     echo "MY Dir = $prev_dir" 
     mkdir -p $1/$x 
     cd $1/$x 
     cd ../ 
     rm -r * 
     cp $prev_dir/$x ./. 
     cd $prev_dir 
done 

======================================== ========

Смежные вопросы