2016-08-04 5 views
-1

Я знаю, что это было задано и обсуждено ранее, но я не мог найти правильный рабочий процесс для этой проблемы.Рабочий процесс Git с большими файлами

Скажем, я работаю над новым проектом, который я хочу нажать на GitHub. После нескольких коммитов и нажатий, которые хорошо работали, я продолжаю кодирование и редактирование, а в какой-то момент Я добавляю в проект несколько больших файлов размером более 100 МБ (не зная или не забывая, что это вызовет проблемы, когда я попытаюсь нажмите его на следующем шаге).

Так что я:

git add . 

и после того, что я делаю:

git commit -m 'some commit message' 

и, наконец:

git push 

А теперь я в беде, потому что я получаю Удаленная ошибка: обнаружены большие файлы.

Итак, какие у меня варианты здесь, чтобы 1. сохранить мои изменения в проекте и мои добавленные файлы живыми и 2. исключить файлы больших файлов из будущих коммитов.

Я нашел команду удалить последнюю фиксацию (где я добавил большие файлы между прочим) с git revert …, но это не хочу, я хочу, потому что он также удаляет всю работу из моего рабочего каталога.

+1

Взгляните на [Git LFS] (https://git-lfs.github.com/). – merlin2011

ответ

0

Это дает тот же эффект, что и ответ Джо А, за исключением его гораздо более простого и, на мой взгляд, гораздо более безопасный для кого-то незнакомый с этим районом.

git reset --soft HEAD~
Это отменяет фиксацию, но оставляет все вещи, которые были бы совершены в качестве поставленных.
Затем git rm файлы, которые не должны были быть зафиксированы, а затем повторно зафиксированы.
Теперь вы должны быть в состоянии нажать.

Примечание: ничего технически неверного с ответом Джо, и я его поддержал; это просто излишне и слишком сложно для такой простой проблемы. Однако если ваша цепочка фиксации включала n> 1, то ответ Джо будет вашим лучшим вариантом. Таким образом, это больше похоже на частный случай, когда вы можете сделать что-то более безопасным, поскольку это была ваша последняя операция, которая была проблематичной.

+0

ЭТО, что я искал! Большое спасибо! Когда я получил ошибку после попытки нажать большой файл, я сделал 'git reset --soft HEAD ~'. Затем я добавил большой файл в файл .gitignore, и все было в порядке. – MaJa

0

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

+0

Точно! Это то, что я ищу. Поэтому я должен проверить команду git rebade, не так ли? Благодаря! – MaJa

+0

Да, вы бы сделали что-то вроде git rebase -i HEAD ~ 1, а затем измените выбор, чтобы отредактировать, git rm этот большой файл, а затем git rebase -continue. – DavidN

+0

Хм, что вы подразумеваете под «change pick to edit»? Когда я делаю 'git rebase -i HEAD ~ 1', vim открывает список команд (pick, reword, edit ...), все прокомментировали. Так что я должен просто изменить порядок списка или раскомментировать команды, которые я хочу использовать (удалить # в начале строки)? – MaJa

1

Для вашей насущной проблемы, вы хотите перебазироваться/редактировать:

git rebase -i HEAD~1 

Где «1» это число фиксаций обратно ваш Bigass совершить это. Например, для 3 совершает назад, я мог бы получить $ EDITOR интерфейс, как:

pick d187a63 Some bigass file and other stuff 
pick d1dff5c Use https for remote service 
pick e8a29cd Add honeybadger 

# Rebase e99b72e..c564a67 onto e99b72e (  3 TODO item(s)) 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# x, exec = run command (the rest of the line) using shell 
# 
# These lines can be re-ordered; they are executed from top to bottom. 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 

Манипулируя без строки комментариев, мерзавец будет применять соответствующие манипуляции с вашими фиксаций. В вашем случае вы хотите изменить «pick» на «edit» для фиксации bigass. Тогда вы будете снова в командной строке в середине-перебазироваться состоянием, в котором вы можете:

git rm bigass.file    # remove the file from the commit 
git commit good.file other.file # make additional commit(s) w/ just the stuff you want 
git rebase --continue   # wrap up rebase 

Чтобы обернуть, исчерпывает все незавершенные файлы (путем удаления, исключение или включение) и git rebase --continue.

ПРИМЕЧАНИЕ. Вы также можете игнорировать сгенерированные файлы локально, не затрагивая .gitignore, используя .git/info/exclude. Вы можете использовать same entries там, который вы бы использовали в .gitignore, но они никогда не будут перенаправлены на удаленный или перезаписанный. Остерегайтесь: это может свести вас с ума, если вы игнорируете что-то неправильно или забываете о том, что игнорируете!

В более широком смысле, если вы сделать намерены версия больших файлов, вы можете быть заинтересованы, чтобы изменить свой рабочий процесс, чтобы использовать git-lfs (Large Storage File), обращаясь к этой точной задачи. Он хранит хэш/указатели содержимого в собственно git и массивные двоичные файлы в облачном хранилище данных. Он имеет поддержку от Github и Microsoft VSO (включая бесплатное неограниченное хранилище) и другие.

+1

Обратите внимание, что после переустановки большого файла вы можете захотеть «git gc» собрать мусор. –

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