簡體   English   中英

從Git刪除文件-混亂

[英]Delete file from Git - confusion

我正在嘗試學習使用Git,並且我已經掌握了拉動和推入等基礎知識,但是我對刪除感到困惑。

這是我所做的(使用fortrabbit和laravel):

  • 創建一個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

您只執行了第一個,則需要提交並推送到遠程刪除該文件。

重要提示 :通常,當你推到一個遙控器,你推到一個光禿禿的倉庫,它應該包含的文件...

這是一個逐步的過程:

  1. 本地和遠程相同

git rm testfile1.php

  1. 本地testfile1.php已刪除,但未提交此更改。 testfile1.php仍然存在於遠程上。

git commit -m 'deleted file'

  1. 本地testfile1.php被刪除,此更改已提交。 您的本地分支是遠程提交的1個提交。 (testfile1.php仍然存在於遠程)

git push origin master

  1. 本地遠程是相同的(如果您位於遠程的存儲庫上,否則,請參閱@ Ajedi32的答案。)

這個問題實際上是針對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM