[英]Delete file from Git - confusion
我正在嘗試學習使用Git,並且我已經掌握了拉動和推入等基礎知識,但是我對刪除感到困惑。
這是我所做的(使用fortrabbit和laravel):
git init .
在項目文件夾中 git remote add origin ...
git add -A
git commit -am 'Initial'
git push -u origin master
現在,我的本地副本與我的遠程副本匹配。
我現在想刪除一個文件,所以我創建一個測試文件:
touch testfile1.php
我添加文件,提交然后推送。 現在,我在本地和遠程都有測試文件。
問題是將其刪除。 這個問題分為2部分:
閱讀此問題: 如何從git repo刪除文件? 它說我應該做:
git rm testfile1.php
git commit -m 'deleted file'
git push origin master
但是,這只會刪除本地副本。 遠程副本仍然存在!
如果我從本地副本中刪除它,那么它也如何從遠程版本中刪除?
我的第二個問題是,如果其他人有副本,他們怎么知道我已刪除文件? 如果他們將副本推回遠程副本,難道它不會只是重新添加已刪除的文件?
任何幫助表示贊賞。
編輯
這是git rm
命令的輸出,以及該命令之后的遠程版本:
第一張圖片是我輸入git rm testfile1.php
文件。 然后輸出rm testfile1.php
並返回到提示。 當我通過SSH返回遠程版本時,testfile`.php仍然存在:/
另一個編輯
我剛剛讀過Fortrabbit提供的一些幫助文章,主要是這篇文章: http ://help.fortrabbit.com/git#toc-behind-the-scenes
它說它會覆蓋,但不會刪除。
這就是為什么git說它是最新的,但文件仍在Web根目錄中的原因嗎? 如果是這樣,出於什么原因可能不會刪除我要求刪除的文件?
好的,現在我明白了。 您期望git push
更改服務器上git存儲庫的工作目錄中的文件。 那不是它的工作原理。 推送到遠程倉庫僅更新git對象數據庫,而不更新工作目錄。 如果您在服務器上運行了git log
,則實際上會看到您推送的提交,但是工作目錄尚未更新。 服務器上的git reset --hard
應該可以解決該問題。
通常,服務器上的git存儲庫被創建為“裸存儲庫”。 裸存儲庫沒有工作目錄,它們僅包含基礎git對象數據庫。 但是,就您的情況而言,您在服務器上創建了完整(非裸機)存儲庫,並將其用作遠程服務器。 不建議這樣做,因為它會產生與您在此處發現的問題類似的問題。
您應該做的是在服務器上創建一個裸存儲庫 ,然后在服務器克隆上進行本地簽出並從中進行更改。
您沒有完成教程建議的所有命令:
git rm testfile1.php
git commit -m 'deleted file'
git push origin master
您只執行了第一個,則需要提交並推送到遠程刪除該文件。
重要提示 :通常,當你推到一個遙控器,你推到一個光禿禿的倉庫,它不應該包含的文件...
這是一個逐步的過程:
git rm testfile1.php
git commit -m 'deleted file'
git push origin master
這個問題實際上是針對Fortrabbit的: http ://help.fortrabbit.com/git#toc-overwrite-but-not-delete
覆蓋但不刪除
舊文件將被通過Git更新的文件覆蓋。 但是,Git部署不會刪除任何內容。 因此,當您從Git存儲庫中刪除文件時,該文件仍會留在網站空間中。
這是處理“運行時內容”的安全默認值。 當您實現圖像上載表單之類的內容時,您會將其他內容上載到您的網站空間。 這些文件直接在Webspace上生成。 因此,它們不是Git回購的一部分。 但是很可能您不希望在每次更改代碼時都將其刪除。
您可以使用fortrabbit.yml文件配置該行為:
http://help.fortrabbit.com/deployment-file
該文件的內容應為:
version: 1
strategy: fullsync
excludes:
- app/storage/
- uploads/
- vendor/
fullsync意味着您的網絡服務器的內容將與本地存儲庫中的內容完全相同。 excludes鍵指定不自動同步的文件夾(您應該在其中放置所有可能包含用戶數據的文件夾,例如化身,或者不在git中但應用程序需要的東西,例如vendor文件夾)
本地刪除文件
rm testfile1.php
然后跑
git rm testfile1.php
git commit -m 'deleted file'
git push origin master
(這就是我日常生活中的方式。)
如果刪除文件並成功推送更改,那么其他人將無法推送其更改,直到他們pull
更改。 在此過程中,文件將從存儲庫的克隆中刪除。 有時,如果他們在本地將更改提交給同一文件,則可能會發生沖突,這表明該文件在遠程已刪除,而在本地已更改。 他們可以解決沖突,然后推送更新
使用“ git commit -a”
如果您打算下一次提交應在工作樹中記錄對跟蹤文件的所有修改,並記錄所有使用rm(而不是git rm)從工作樹中刪除的文件的刪除,請使用git commit -a,因為將自動通知並記錄所有清除情況。 您也可以通過使用git add -u來實現類似的效果而無需提交。
第一:
rm testfile1.php
然后:
git add .
git commit -m 'message'
git push
在我的日常工作中,無論創建,修改或刪除文件,最后三個步驟都是相同的。 這對我來說可以。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.