diff --git a/README.md b/README.md
index 64dc025..53e1582 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,9 @@
 [![Build and Test](https://github.com/actions/checkout/actions/workflows/test.yml/badge.svg)](https://github.com/actions/checkout/actions/workflows/test.yml)
 
+Changes compared to https://github.com/actions/checkout:
+- Can exclude path when cleaning repository
+
+
 # Checkout V4
 
 This action checks-out your repository under `$GITHUB_WORKSPACE`, so your workflow can access it.
@@ -77,7 +81,10 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
     # Whether to execute `git clean -ffdx && git reset --hard HEAD` before fetching
     # Default: true
     clean: ''
-
+    
+    # Path to exclude from cleaning
+    exclude_from_clean: ''
+    
     # Partially clone against a given filter. Overrides sparse-checkout if set.
     # Default: null
     filter: ''
diff --git a/src/git-command-manager.ts b/src/git-command-manager.ts
index 8e42a38..bcba801 100644
--- a/src/git-command-manager.ts
+++ b/src/git-command-manager.ts
@@ -57,7 +57,7 @@ export interface IGitCommandManager {
   submoduleUpdate(fetchDepth: number, recursive: boolean): Promise<void>
   submoduleStatus(): Promise<boolean>
   tagExists(pattern: string): Promise<boolean>
-  tryClean(): Promise<boolean>
+  tryClean(exclude_from_clean: string | undefined): Promise<boolean>
   tryConfigUnset(configKey: string, globalConfig?: boolean): Promise<boolean>
   tryDisableAutomaticGarbageCollection(): Promise<boolean>
   tryGetFetchUrl(): Promise<string>
@@ -434,8 +434,13 @@ class GitCommandManager {
     return !!output.stdout.trim()
   }
 
-  async tryClean(): Promise<boolean> {
-    const output = await this.execGit(['clean', '-ffdx'], true)
+  async tryClean(exclude_from_clean: string | undefined): Promise<boolean> {
+    let output
+    if (exclude_from_clean === undefined) {
+      output = await this.execGit(['clean', '-ffdx'], true)
+    } else {
+      output = await this.execGit(['clean', '-ffdx', '-e', exclude_from_clean], true)
+    }
     return output.exitCode === 0
   }
 
diff --git a/src/git-directory-helper.ts b/src/git-directory-helper.ts
index 9a0085f..1ecff60 100644
--- a/src/git-directory-helper.ts
+++ b/src/git-directory-helper.ts
@@ -11,6 +11,7 @@ export async function prepareExistingDirectory(
   repositoryPath: string,
   repositoryUrl: string,
   clean: boolean,
+  exclude_from_clean: string | undefined,
   ref: string
 ): Promise<void> {
   assert.ok(repositoryPath, 'Expected repositoryPath to be defined')
@@ -90,7 +91,7 @@ export async function prepareExistingDirectory(
       // Clean
       if (clean) {
         core.startGroup('Cleaning the repository')
-        if (!(await git.tryClean())) {
+        if (!(await git.tryClean(exclude_from_clean))) {
           core.debug(
             `The clean command failed. This might be caused by: 1) path too long, 2) permission issue, or 3) file in use. For further investigation, manually run 'git clean -ffdx' on the directory '${repositoryPath}'.`
           )
diff --git a/src/git-source-provider.ts b/src/git-source-provider.ts
index 2d35138..4c8f338 100644
--- a/src/git-source-provider.ts
+++ b/src/git-source-provider.ts
@@ -70,6 +70,7 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
         settings.repositoryPath,
         repositoryUrl,
         settings.clean,
+        settings.exclude_from_clean,
         settings.ref
       )
     }
diff --git a/src/git-source-settings.ts b/src/git-source-settings.ts
index 4e41ac3..047fa2c 100644
--- a/src/git-source-settings.ts
+++ b/src/git-source-settings.ts
@@ -29,6 +29,11 @@ export interface IGitSourceSettings {
    */
   clean: boolean
 
+   /**
+   * Indicates path to exclude when cleaning
+   */
+  exclude_from_clean: string | undefined
+
   /**
    * The filter determining which objects to include
    */
diff --git a/src/input-helper.ts b/src/input-helper.ts
index 059232f..701ac94 100644
--- a/src/input-helper.ts
+++ b/src/input-helper.ts
@@ -82,6 +82,10 @@ export async function getInputs(): Promise<IGitSourceSettings> {
   result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE'
   core.debug(`clean = ${result.clean}`)
 
+  // Clean
+  result.exclude_from_clean = core.getInput('exclude_from_clean')
+  core.debug(`exclude_from_clean = ${result.exclude_from_clean}`)
+
   // Filter
   const filter = core.getInput('filter')
   if (filter) {